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);

非常感谢任何帮助。


慕姐4208626
浏览 123回答 2
2回答

jeck猫

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

幕布斯7119047

对于计数和平均值,summaryStatistics这就是您所需要的。但是如果你有一些其他的终端操作并且你还需要计算元素,你可以使用peekor :AtomicLongAtomicIntegerAtomicLong 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();
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java