首页 > 解决方案 > Java 8 Stream:一次平均和计数

问题描述

我有一个DoubleStream从一个非常耗时的函数计算出来的函数,我想同时计算其元素的平均值和计数。

问题是我不想计算DoubleStream两次,因为提到的值计算耗时。我想从一个 lambda 表达式中获取 Average 和 Count 的值。

我已经尝试了一切collect等等map,但没有成功。

    final long count = products.stream()
            .mapToDouble(this::timeConsumingCalculateRating)
            .filter(rating -> rating > 0.0D)
            .count();

    final double averageRating = products.stream()
            .mapToDouble(this::timeConsumingCalculateRating)
            .filter(rating -> rating > 0.0D)
            .average()
            .orElse(0.0D);

非常感谢任何帮助。

标签: javajava-8java-stream

解决方案


使用summaryStatistics()

DoubleSummaryStatistics stats = products.stream()
            .mapToDouble(this::timeConsumingCalculateRating)
            .filter(rating -> rating > 0.0D)
            .summaryStatistics();
long count = stats.getCount();
double averageRating = stats.getAverage();

推荐阅读