众所周知,SummaryStatistics包含count,sum,min,average,max值。 如果我只返回计数和总和值,它可能更有效吗?如果是这样,如何实现呢?
您可以编辑以下代码以显示:
Stream.of(0.55f, 0.45f, 0.5f, 0.65f, 0f).
filter(i -> i > 0.5).mapToInt(i -> (int) (i * 100 - 50)).summaryStatistics()
谢谢
答案 0 :(得分:1)
如果我理解正确,您会询问是否应该遍历源两次或一次并使用IntSummaryStatistics
。就像这样会更便宜:
Stream.of(0.55f, 0.45f, 0.5f, 0.65f, 0f)
.filter(i -> i > 0.5)
.mapToInt(i -> (int) (i * 100 - 50))
.count();
Stream.of(0.55f, 0.45f, 0.5f, 0.65f, 0f)
.filter(i -> i > 0.5)
.mapToInt(i -> (int) (i * 100 - 50))
.sum();
对战:
IntSummaryStatistics summaryStatistics = Stream.of(0.55f, 0.45f, 0.5f, 0.65f, 0f)
.filter(i -> i > 0.5)
.mapToInt(i -> (int) (i * 100 - 50))
.summaryStatistics();
summaryStatistics.getSum();
summaryStatistics.getCount();
如果没有衡量它很难说,但请注意,如果没有清除count
标志的操作,则使用SIZED
时,可能会完全跳过某些操作。例如:
long result = Stream.of(1, 2, 3, 4, 5)
.mapToInt(x -> {
System.out.println("mapping");
return x;
})
.count();
System.out.println(result);
这里根本不需要处理mapToInt
- 实际上在java-9中这将被跳过。 IntSummaryStatistics
不会进行相同的优化,其中计数始终是计算的。在你的例子中情况并非如此,但要了解一件好事。
既然你说你以任何一种方式使用count
和sum
,我仍会选择IntSummaryStatistics
重复两次。在IntSummaryStatistics
中完成的唯一其他两项操作是Math.min
和Math.max
。