Вызов метода из API потока в Java

Я новичок в 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;
}

Вам не нужен addNumbers, кстати ... это то, что Long::sum уже делает

Eugene 08.09.2018 22:25

Если я хочу выполнить более сложную операцию с числовыми данными, то хорошо иметь отдельный метод для этой операции (этот метод наконец возвращает номер). Как я могу вызвать этот метод из collectors.toMap? Есть предложения?

Ankita Goyal 08.09.2018 22:31

как и любой другой метод ссылки ... this::addNumbers вместо Long::sum, который я использовал

Eugene 08.09.2018 22:32
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
7
3
649
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Есть более простой способ с 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);

Другие вопросы по теме