java - 从java中的stream api调用方法

标签 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
}

输出:: map

{
 "userId":1,
 "sum":90 // addition of all numbers associated with userId
}

我想使用 java 8 stream api。

我正在尝试这样,但它给了我错误,

  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::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);

关于java - 从java中的stream api调用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52239065/

相关文章:

java - Spring 事务 REQUIRED 与 REQUIRES_NEW : Rollback Transaction

java - 我想以列或列表的形式打印枚举器数据

java-8 - 如何从jdbc结果集中返回java8 Stream

java - Android - 在 ImageView 中交叉淡化多个图像

java - 增加分配给jdk的内存

java - 将 CompletableFutures 组合成树状结构

java - 如何对集合子集应用进一步的过滤器

java-8 - 使用带有列表列表的平面 map

java - 函数式接口(interface)和递归

java - 如何在应用某些函数后有效地计算集合的最大值