java - 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);
非常感谢任何帮助。
解决方案
使用summaryStatistics()
:
DoubleSummaryStatistics stats = products.stream()
.mapToDouble(this::timeConsumingCalculateRating)
.filter(rating -> rating > 0.0D)
.summaryStatistics();
long count = stats.getCount();
double averageRating = stats.getAverage();
推荐阅读
- ios - 在堆栈导航器之上创建新的堆栈导航器
- java - Java Input Needed Twice - 我解析了一个整数,所以我可以使用scanner.next();
- android - 如何将带圆圈的计数器添加到导航抽屉中的项目
- java - spring data mongo db:扩展基域类时出现重复键错误
- php - 如何使用 ajax 在 laravel 控制器中编写带参数的路由名称
- javascript - 将滚动类添加到数组的每个元素
- python - 如何修改 Dijkstra 的算法,使其通过 python 中给定的多条边?
- python - 如何找到不使用 min() 或 max() 的输入的最小和最大数
- swift - iOS 13 中的后台任务不会多次运行
- php - 在长回显字符串php中添加div