java 8如何仅返回SummaryStatistics中的sum和count值

时间:2017-09-12 02:01:05

标签: java functional-programming java-8

众所周知,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()

谢谢

1 个答案:

答案 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不会进行相同的优化,其中计数始终是计算的。在你的例子中情况并非如此,但要了解一件好事。

既然你说你以任何一种方式使用countsum,我仍会选择IntSummaryStatistics重复两次。在IntSummaryStatistics中完成的唯一其他两项操作是Math.minMath.max