mapToDouble() 对于使用 Java 8 流对 List<Double> 进行求和真的必要吗?
据我所知,使用Java 8流求和的方法是这样的:List<Double>
List<Double> vals = . . . ;
double sum = vals.stream().mapToDouble(Double::doubleValue).sum();
对我来说,这似乎有点粗糙 - 只是lambdas和stream应该省略的那种样板“仪式”。mapToDouble(Double::doubleValue)
最佳实践告诉我们,首选实例而不是数组,但对于这种求和,数组似乎更干净:List
double[] vals = . . . ;
double sum = Arrays.stream(vals).sum();
当然,可以这样做:
List<Double> 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);
我不知道新的静态方法。加上1.8,它似乎是为了我所描述的目的。我还发现和.展望未来,我肯定会使用这个成语进行此类操作和类似操作。Double.sum()
Double.min()
Double.max()
List<Double>