如何总结与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);