nic*_*mon 2 java java-8 java-stream
我有一个DoubleStream从非常耗时的函数计算出来的值,我想同时计算其元素的平均值和计数。
问题是我不想计算DoubleStream两次,因为提到了耗时的值计算。我想从一个lambda表达式中获得平均值和计数的值。
我已经试过各种与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);
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)
对于计数和平均值,summaryStatistics这就是您所需要的。但如果您有其他终端操作并且还需要计算元素数量,则可以peek与AtomicLongor一起使用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)
| 归档时间: |
|
| 查看次数: |
170 次 |
| 最近记录: |