就我可以告诉,总和列表使用Java 8流是这样的:
List vals = . . . ;
double sum = vals.stream().mapToDouble(Double::doubleValue).sum();
对我来说,mapToDouble(double :: doubleValue)似乎是一种crufty – 只是那种样板“仪式”,lambda和stream应该免除。
最佳做法告诉我们喜欢List实例对数组,但是对于这种求和,数组看起来更干净:
double[] vals = . . . ;
double sum = Arrays.stream(vals).sum();
授予,可以这样做:
List vals = . . . ;
double sum = vals.stream().reduce(0.0, (i,j) -> i+j);
但是reduce(….)比sum()长得多。
我得到这与流需要改进围绕Java的非对象原语的方式,但仍然,我错过了这里的东西吗?有没有办法挤压自动装箱,使这个更短?或者这只是当前的艺术状态?
更新 – 答案摘要
这里是一个下面的答案摘要。虽然我在这里有一个总结,我敦促读者仔细阅读答案。
@dasblinkenlight解释说,某种类型的解包将总是必要的,由于在Java的历史上做出的决定,特别是在仿制实现方式和它们与非对象原语的关系。他指出,在理论上,编译器可能直观的解开并允许更简单的代码,但这还没有实现。
@Holger显示了一个非常接近我所问的表达性的解决方案:
double sum = vals.stream().reduce(0.0, Double::sum);
我不知道新的静态Double.sum()方法。添加1.8,它似乎是为了我的描述的目的。我也发现Double.min()和Double.max()。今后,我一定会使用这个成语在List< Double>和类似。