Collectors.summingInt()vs mapToInt()。sum()

时间:2016-05-04 09:33:58

标签: java java-8 sum java-stream

如果要对流中的整数值求和,有两种主要方法:

ToIntFunction<...> mapFunc = ...
int sum = stream().collect(Collectors.summingInt(mapFunc))

int sum = stream().mapToInt(mapFunc).sum()

第一个涉及装箱返回的整数&amp;拆箱,但第二步还有一个额外的步骤。

哪个更有效/更清晰?

1 个答案:

答案 0 :(得分:16)

您正在查看两个不同的用例的交集。使用mapToInt(…)可以在终端操作之前链接其他IntStream操作。相比之下,Collectors.summingInt(…)可以与其他收藏家合并,例如用作groupingBy收集器中的下游收集器。对于这些用例,毫无疑问使用哪种用途。

在您的特殊情况下,当您没有首先进行更多操作或与收藏家打交道时,这两种方法之间没有根本区别。尽管如此,使用更具可读性的那个有一点意义。通常,当流上的预定义操作执行相同操作时,您不使用收集器。当你可以使用collect(Collectors.reducing(…))时,你不会使用.reduce(…),是吗?

不仅mapToInt(mapFunc).sum()被缩短了,它还遵循通常的从左到右的顺序,在概念上发生的事情,首先转换为int,然后将这些int加起来。我认为这比.collect(Collectors.summingInt(mapFunc))更喜欢这种替代方案。