Java 8 Stream:平均并立即计数

nic*_*mon 2 java java-8 java-stream

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

问题是我不想计算DoubleStream两次,因为提到了耗时的值计算。我想从一个lambda表达式中获得平均值和计数的值。

我已经试过各种与collectmap等,但没有成功。

    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);
Run Code Online (Sandbox Code Playgroud)

非常感谢您的帮助。

Era*_*ran 10

用途summaryStatistics()

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


tob*_*s_k 5

对于计数和平均值,summaryStatistics这就是您所需要的。但如果您有其他终端操作并且还需要计算元素数量,则可以peekAtomicLongor一起使用AtomicInteger

AtomicLong counter = new AtomicLong();
double average = products.stream()
        .mapToDouble(this::timeConsumingCalculateRating)
        .filter(rating -> rating > 0.0D)
        .peek(d -> counter.incrementAndGet())
        .average().orElse(0.0);
long count = counter.get();
Run Code Online (Sandbox Code Playgroud)