我正在寻找最优雅的方式来创建来自DoubleStream
的{{1}}(使用总和,平均值等)。目前我有这样的代码:
List<Double>
也许有人可以建议更短的方式?
答案 0 :(得分:14)
从Stream
获取统计信息的最佳方法是使用...SummaryStatistics
类。对于Stream<Double>
,这是DoubleSummaryStatistics
:
List<Double> doubles = getListOfDoubles();
DoubleSummaryStatistics stats = doubles.stream().collect(Collectors.summarizingDouble(Double::doubleValue));
System.out.println(stats.getAverage());
System.out.println(stats.getSum());
通过使用summarizingDouble
收集器收集流来获得。这个收集器以ToDoubleFunction
为参数:它是一个应该返回double
进行分析的函数。
可以获得Integer
,Long
和Double
值的此类统计信息。
请注意,将Collection<Double>
转换为DoubleStream
的一般情况可以使用您已有的代码完成:
List<Double> doubles = getListOfDoubles();
DoubleStream stream = doubles.stream().mapToDouble(Double::doubleValue);
答案 1 :(得分:1)
你可以这样做(即使它没有明显缩短,但......):
double sum = doubles.stream().collect(Collectors.summingDouble(x -> x));
或
double sum = DoubleStream.of(doubles.stream().mapToDouble(x->x).toArray()).sum();
但后者与您的方法大致相同。