为了账号安全,请及时绑定邮箱和手机立即绑定

Java 8 Stream:一次平均和计数

Java 8 Stream:一次平均和计数

慕姐4208626 2023-05-17 14:19:04
我有一个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);非常感谢任何帮助。
查看完整描述

2 回答

?
jeck猫

TA贡献1909条经验 获得超7个赞

使用summaryStatistics()

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


查看完整回答
反对 回复 2023-05-17
?
幕布斯7119047

TA贡献1794条经验 获得超8个赞

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


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


查看完整回答
反对 回复 2023-05-17
  • 2 回答
  • 0 关注
  • 163 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信