我有一個(gè)DoubleStream是從一個(gè)非常耗時(shí)的函數(shù)計(jì)算出來的,我想同時(shí)計(jì)算它的元素的平均值和計(jì)數(shù)。問題是我不想計(jì)算DoubleStream兩次,因?yàn)樯厦嫣岬降闹涤?jì)算很耗時(shí)。我想從一個(gè) lambda 表達(dá)式中獲取 Average 和 Count 的值。我已經(jīng)嘗試了一切等等,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貢獻(xiàn)1909條經(jīng)驗(yàn) 獲得超7個(gè)贊
使用summaryStatistics()
:
DoubleSummaryStatistics?stats?=?products.stream() ????????????.mapToDouble(this::timeConsumingCalculateRating) ????????????.filter(rating?->?rating?>?0.0D) ????????????.summaryStatistics();long?count?=?stats.getCount(); ????????????double?averageRating?=?stats.getAverage();

幕布斯7119047
TA貢獻(xiàn)1794條經(jīng)驗(yàn) 獲得超8個(gè)贊
對(duì)于計(jì)數(shù)和平均值,summaryStatistics這就是您所需要的。但是如果你有一些其他的終端操作并且你還需要計(jì)算元素,你可以使用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();
添加回答
舉報(bào)
0/150
提交
取消