众所周知,摘要统计信息包含计数,总和,最小值,平均值,最大值。
如果只返回计数和总和值可能会更有效吗?如果是,如何实现呢?
您可以编辑以下代码向我展示:
Stream.of(0.55f, 0.45f, 0.5f, 0.65f, 0f).
filter(i -> i > 0.5).mapToInt(i -> (int) (i * 100 - 50)).summaryStatistics()
谢谢
最佳答案
如果我对您的理解正确,那么您正在询问是否应遍历源代码两次或一次并使用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
。