集合<double>到DoubleStream

时间:2015-09-14 12:57:32

标签: java collections java-8 java-stream

我正在寻找最优雅的方式来创建来自DoubleStream的{​​{1}}(使用总和,平均值等)。目前我有这样的代码:

List<Double>

也许有人可以建议更短的方式?

2 个答案:

答案 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进行分析的函数。

可以获得IntegerLongDouble值的此类统计信息。

请注意,将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();

但后者与您的方法大致相同。