这个问题在这里已有答案:
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
分析。
可以获得这样的统计数据 Integer
, Long
和 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