如何总结与javastream整数列表?

我想总结一个整数列表。 它的工作原理如下,但语法不正确。 代码能被优化吗?

Map<String, Integer> integers; integers.values().stream().mapToInt(i -> i).sum(); 

这将工作,但i -> i正在做一些自动拆箱,这就是为什么它“感到”奇怪。 下面的任何一个都可以工作,并且能够更好地解释编译器在你的原始语法下正在做什么:

 integers.values().stream().mapToInt(i -> i.intValue()).sum(); integers.values().stream().mapToInt(Integer::intValue).sum(); 

我build议另外2个选项:

 integers.values().stream().mapToInt(Integer::intValue).sum(); integers.values().stream().collect(Collectors.summingInt(Integer::intValue)); 

第二个使用Collectors.summingInt()收集器,还有一个summingLong()收集器,你可以使用mapToLong


还有第三个选项:Java 8引入了一个非常有效的LongAdder累加器,旨在加速汇总并行stream和multithreading环境。 在这里,有一个示例使用:

 LongAdder a = new LongAdder(); map.values().parallelStream().forEach(a::add); sum = a.intValue(); 

从文档

约简操作约简操作(也称为折叠)通过重复应用组合操作(例如查找一组数字的和或最大值)或将元素累加到一个列表。 stream类有多种forms的通用约简操作,分别称为reduce()和collect(),以及sum(),max()或count()等多种专用简化forms。

当然,这样的操作可以很容易地实现为简单的顺序循环,如下所示:

 int sum = 0; for (int x : numbers) { sum += x; } 

但是,有一个很好的理由来select减less操作而不是像上面这样的变化积累。 不仅减less“更抽象” – 它作为一个整体而不是单个元素运行 – 但是一个适当构造的减less操作本质上是可并行化的,只要用于处理元素的函数是关联的和无国籍。 例如,给定一个我们想要find总和的数字stream,我们可以这样写:

 int sum = numbers.stream().reduce(0, (x,y) -> x+y); 

要么:

 int sum = numbers.stream().reduce(0, Integer::sum); 

这些还原操作可以平行运行,几乎不需要修改:

 int sum = numbers.parallelStream().reduce(0, Integer::sum); 

所以,你可以使用一个地图:

 integers.values().stream().mapToInt(i -> i).reduce(0, (x,y) -> x+y); 

要么:

 integers.values().stream().reduce(0, Integer::sum); 

你可以使用reduce方法:

 long creditAmountSum = result.stream().map(e -> e.getCreditAmount()).reduce(0L, (x, y) -> x + y); 

要么

 long creditAmountSum = result.stream().map(e -> e.getCreditAmount()).reduce(0L, Integer::sum);