通过Java Stream汇总ArrayList <Double>

Joe*_*oel 18 double java-8 java-stream

我试图弄清楚如何总结'ArrayList'的所有元素.

我已经尝试过了:

 double totalevent = myList.stream().mapToDouble(f -> f).sum();
Run Code Online (Sandbox Code Playgroud)

虽然myList是一个ArrayList<Double>.

没有无用的mapToDouble功能有没有办法做到这一点?

Tag*_*eev 33

mapToDouble调用没有用处:它执行隐式拆箱.实际上它是一样的

double totalevent = myList.stream().mapToDouble(f -> f.doubleValue()).sum();
Run Code Online (Sandbox Code Playgroud)

要么

double totalevent = myList.stream().mapToDouble(Double::doubleValue).sum();
Run Code Online (Sandbox Code Playgroud)

或者你可以使用summingDouble收藏家,但这不是一个很大的区别:

double totalevent = myList.stream().collect(summingDouble(f -> f));
Run Code Online (Sandbox Code Playgroud)

在我的StreamEx库中,您可以DoubleStream直接构建一个Collection<Double>:

double totalevent = DoubleStreamEx.of(myList).sum();
Run Code Online (Sandbox Code Playgroud)

但在内部它也使用 mapToDouble.

  • @Joel,这取决于你想要达到的目标.您可能会注意到`for(double val:myList)sum + = val;`可能会产生不同的结果,因为`double`类型的精度有限.流解决方案实现了Kahan求和算法,该算法在消除舍入误差方面做得很好.当然它速度较慢,但​​结果更正确,特别是如果你有不同数量的数字.如果您不关心这一点,请随意使用正常循环. (2认同)