【问题标题】:Collection<Double> to DoubleStream [duplicate]Collection<Double> 到 DoubleStream [重复]
【发布时间】:2015-09-14 12:57:32
【问题描述】:

我正在寻找从List&lt;Double&gt; 创建DoubleStream(用于使用总和、平均值等)的最优雅的方法。目前我有这样的代码:

List<Double> doubles = getListOfDoubles();
double sum = doubles.stream()
                    .mapToDouble(d -> d)
                    .sum();

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

【问题讨论】:

  • 我的意思是,我们重载了 Arrays.toStream(...) 可以返回不同的 Streams,那么为什么 Collections 没有类似的东西呢?
  • Arrays哪里有这样的东西?
  • @RealSkeptic Arrays javadoc static DoubleStream stream(double[] array) Returns a sequential DoubleStream with the specified array as its source. IntStream、LongStream 类似抱歉格式化
  • 但这需要double(原语)数组,而不是Double数组。这就是与Collections 的区别。
  • @Marco13: mapToDouble 拆箱方法。这是在 generic Stream 上提供此类功能的唯一方法。您必须指定生成三个备选方案(IntStreamLongStreamDoubleStream)中的哪一个,并且必须指定一个函数,该函数可以将运行时流中未知的元素类型转换为目标类型.这正是mapToDouble(ToDoubleFunction) 所提供的。

标签: java collections java-8 java-stream


【解决方案1】:

Stream 获取统计信息的最佳方法是使用...SummaryStatistics 类。对于Stream&lt;Double&gt;,这是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&lt;Double&gt; 转换为DoubleStream 的一般情况可以使用您已有的代码完成:

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

【讨论】:

    【解决方案2】:

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

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

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

    但后者与您的方法或多或少相同。

    【讨论】:

    • 并非如此。将整个流存储到中间数组中是一种资源浪费,与此处显示的所有其他解决方案相比没有任何优势。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-23
    • 1970-01-01
    • 2016-01-04
    • 2021-12-18
    • 2020-06-22
    • 2015-10-15
    相关资源
    最近更新 更多