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

the*_*oop 20 java sum java-8 java-stream

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

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

int sum = stream().mapToInt(mapFunc).sum()
Run Code Online (Sandbox Code Playgroud)

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

哪个更有效/更清晰?

Hol*_*ger 18

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

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

不仅是mapToInt(mapFunc).sum()短路,它还遵循通常的从左到右的顺序,在概念上发生的事情,首先转换为a int,然后将这些int加起来.我认为这有理由选择这种替代方案.collect(Collectors.summingInt(mapFunc)).

  • @holi-java:这是一方面。 (2认同)