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

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

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

第一个涉及装箱返回的整数并将其拆箱,但第二个步骤涉及额外的步骤。

哪个更有效/更清晰?

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

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

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