Я новичок в java 8. Я пытаюсь выполнить сценарий ниже.
class Numbers{
private Long userId;
private Long number1;
private Long number2;
}
List<Numbers> list = new ArrayList();
Input == {
"userId":1,
"number1":10,
"number2":20
}
{
"userId":1,
"number1":20,
"number2":40
}
output :: Map
{
"userId":1,
"sum":90 // addition of all numbers associated with userId
}
Я хочу использовать api потока java 8.
Я пытаюсь вот так, но это дает мне ошибку,
Map<Long, Long> hashMap =results.stream().collect(Collectors.toMap(Numbers::userId,Collectors.summingLong(?));
Итак, мой вопрос,
Могу ли я вызвать метод ниже из Collectors.toMap()
Long addNumbers(Long number1,Long number2){
return number1+number2;
}
Если я хочу выполнить более сложную операцию с числовыми данными, то хорошо иметь отдельный метод для этой операции (этот метод наконец возвращает номер). Как я могу вызвать этот метод из collectors.toMap? Есть предложения?
как и любой другой метод ссылки ... this::addNumbers
вместо Long::sum
, который я использовал
Есть более простой способ с Collectors::groupingBy
с нижележащим сборщиком:
results.stream().collect(
Collectors.groupingBy(
Numbers::getUserId, Collectors.summingLong(x -> x.getNumber1() + x.getNumber2())
)
);
Вы все еще можете сделать это с помощью Collectors.toMap
:
results.stream().collect(
Collectors.toMap(
Numbers::getUserId,
x -> x.getNumber1() + x.getNumber2(),
Long::sum
)
);
Или без потоков:
Map<Long, Long> all = new HashMap<>();
numbers.forEach(x -> all.merge(
x.getUserId(),
x.getNumber1() + x.getNumber2(),
Long::sum);
Вам не нужен
addNumbers
, кстати ... это то, чтоLong::sum
уже делает