我有一个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();
幕布斯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();
添加回答
举报
0/150
提交
取消