问题 集合到DoubleStream [复制]


这个问题在这里已有答案:


5685
2017-09-14 12:57


起源

我的意思是,我们重载了可以返回不同Streams的Arrays.toStream(...),那么为什么Collections没有类似的东西呢? - Anatrollik
哪里有这样的东西 Arrays? - RealSkeptic
@RealSkeptic 数组javadoc  static DoubleStream stream(double[] array) Returns a sequential DoubleStream with the specified array as its source.  类似于IntStream,LongStream P.S.抱歉格式化 - Anatrollik
但这需要一系列的 double (原始),而不是数组 Double。这就是它的不同之处 Collections。 - RealSkeptic
@ Marco13: mapToDouble  是 unbox方法。这是在a上提供此类功能的唯一方法 通用  Stream。你必须指定三种替代方案中的哪一种(IntStream, LongStream 要么 DoubleStream生成并且您必须指定一个函数,该函数可以将运行时未知的元素类型转换为目标类型。那正是如此 mapToDouble(ToDoubleFunction) 提供。 - Holger


答案:


从a获取统计数据的最佳方法 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 分析。

可以获得这样的统计数据 IntegerLong 和 Double 值。

注意转换a的一般情况 Collection<Double> 到了 DoubleStream 可以使用您已有的代码完成:

List<Double> doubles = getListOfDoubles();
DoubleStream stream = doubles.stream().mapToDouble(Double::doubleValue);

13
2017-09-14 13:01





你可以这样做(即使它没有明显缩短,但......):

double sum = doubles.stream().collect(Collectors.summingDouble(x -> x));

要么

double sum = DoubleStream.of(doubles.stream().mapToDouble(x->x).toArray()).sum();

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


1
2017-09-14 12:59



不是真的。将整个流存储到中间阵列是浪费资源,而不会优于此处显示的所有其他解决方案。 - Holger