当您要对流中的整数值求和时,有两种主要的实现方式:
ToIntFunction<...> mapFunc = ...
int sum = stream().collect(Collectors.summingInt(mapFunc))int sum = stream().mapToInt(mapFunc).sum()
第一个涉及对返回的整数进行装箱
- 纯粹是我的观点:第二点更容易阅读。
- 如果您想知道哪种方法更有效的基准测试,但是第二种方法对读者恕我直言更为清晰。
使用mapToInt()允许您在终端操作之前链接其他IntStream操作。相反,Collectors.summingInt()可以与其他收集器(例如用作groupingBy收集器中的下游收集器。对于这些用例,毫无疑问要使用哪个。
在特殊情况下,当您不链接更多操作或不首先与收集器打交道时,这两种方法之间就没有根本的区别。
尽管如此,使用更具可读性的方法还是有道理的。通常,当流上存在预定义的操作时,您就不会使用收集器。当您只能使用.reduce()时,您不会使用collect(Collectors.reducing()),对吗?
不仅缩短了mapToInt(mapFunc).sum(),而且还遵循通常的从左到右的顺序进行概念上的处理,首先转换为int,然后将这些int加起来。我认为这证明了在.collect(Collectors.summingInt(mapFunc))上更喜欢这种选择。