我有一個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
提交
取消