从java中的流api调用方法

Ank*_*yal 6 java java-8 java-stream collectors

我是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
}
Run Code Online (Sandbox Code Playgroud)

输出::地图

{
 "userId":1,
 "sum":90 // addition of all numbers associated with userId
}
Run Code Online (Sandbox Code Playgroud)

我想用java 8 stream api.

我这样想,但它给了我错误,

  Map<Long, Long> hashMap  =results.stream().collect(Collectors.toMap(Numbers::userId,Collectors.summingLong(?));
Run Code Online (Sandbox Code Playgroud)

所以我的问题,我可以调用下面的方法 Collectors.toMap()

Long addNumbers(Long number1,Long number2){
return number1+number2;
}
Run Code Online (Sandbox Code Playgroud)

Eug*_*ene 10

Collectors::groupingBy下游收集器有一种更简单的方法:

results.stream().collect(
     Collectors.groupingBy(
           Numbers::getUserId, Collectors.summingLong(x -> x.getNumber1() + x.getNumber2())
     )
);
Run Code Online (Sandbox Code Playgroud)

你仍然可以这样做Collectors.toMap:

results.stream().collect(
    Collectors.toMap(
         Numbers::getUserId,
         x -> x.getNumber1() + x.getNumber2(),
         Long::sum   
    )
);
Run Code Online (Sandbox Code Playgroud)

或者没有溪流:

Map<Long, Long> all = new HashMap<>();
numbers.forEach(x -> all.merge(
                  x.getUserId(), 
                  x.getNumber1() + x.getNumber2(), 
                  Long::sum);
Run Code Online (Sandbox Code Playgroud)