据我所知,List<Double>使用Java 8流总结的方法是这样的:
List<Double> vals = . . . ;
double sum = vals.stream().mapToDouble(Double::doubleValue).sum();
Run Code Online (Sandbox Code Playgroud)
对我来说,这mapToDouble(Double::doubleValue)似乎是一种狡猾 - 只是那种lambdas和溪流应该免除的样板"仪式".
最佳实践告诉我们更喜欢List实例而不是数组,但是对于这种求和,数组似乎更清晰:
double[] vals = . . . ;
double sum = Arrays.stream(vals).sum();
Run Code Online (Sandbox Code Playgroud)
当然,人们可以这样做:
List<Double> vals = . . . ;
double sum = vals.stream().reduce(0.0, (i,j) -> i+j);
Run Code Online (Sandbox Code Playgroud)
但那reduce(....)比这长得多sum().
我知道这与流需要围绕Java的非对象原语进行改造的方式有关,但是,我在这里遗漏了一些东西吗?有没有办法挤压自动装箱以缩短它?或者这仅仅是当前最先进的技术?
以下是答案的摘要.虽然我在这里有一个摘要,但我敦促读者自己仔细阅读答案.
@dasblinkenlight解释说,由于Java历史上的进一步决策,特别是在实现泛型的方式以及它们与非对象原语的关系中,因此总是需要某种拆箱.他指出,理论上编译器可以直接进行拆箱并允许使用简短的代码,但这还没有实现.
@Holger展示了一个非常接近我所询问的表现力的解决方案:
double sum = vals.stream().reduce(0.0, Double::sum);
Run Code Online (Sandbox Code Playgroud)
我不知道新的静态Double.sum()方法.添加1.8,似乎是出于我描述的目的.我也发现了Double.min()和Double.max().展望未来,我肯定会使用这个成语来进行类似的操作List<Double>.