众所周知,摘要统计信息包含计数,总和,最小值,平均值,最大值。
如果只返回计数和总和值可能会更有效吗?如果是,如何实现呢?

您可以编辑以下代码向我展示:

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不会进行相同的优化,因为总是会计算计数。在您的示例中,情况并非如此,但要了解的一件好事。

既然您说使用countsum任一种方式,我还是会选择IntSummaryStatistics而不是进行两次迭代。 IntSummaryStatistics中仅执行的另外两个操作是Math.minMath.max

10-01 19:20