【问题标题】:Invoke method from stream api in java从java中的流api调用方法
【发布时间】:2018-09-08 20:15:59
【问题描述】:

我是 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
}

输出:: 地图

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

我想使用 java 8 流 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;
}

【问题讨论】:

  • 你不需要 addNumbers 顺便说一句...这就是 Long::sum 已经做的事情
  • 如果我想对数字数据执行更复杂的操作,那么最好有该操作的单独方法(该方法最终返回数字)。我如何从 collectors.toMap 调用该方法?任何建议?
  • 作为任何其他方法参考...this::addNumbers 而不是我使用过的Long::sum

标签: java java-8 java-stream collectors


【解决方案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);

【讨论】:

    猜你喜欢
    • 2011-01-24
    • 2021-01-19
    • 2019-12-27
    • 1970-01-01
    • 1970-01-01
    • 2014-07-13
    • 2014-04-05
    • 1970-01-01
    相关资源
    最近更新 更多