如果要对流中的整数值求和,有两种主要方法:
ToIntFunction<...> mapFunc = ...
int sum = stream().collect(Collectors.summingInt(mapFunc))
int sum = stream().mapToInt(mapFunc).sum()
Run Code Online (Sandbox Code Playgroud)
第一个涉及装箱返回的整数并将其拆箱,但第二个步骤涉及额外的步骤.
哪个更有效/更清晰?
请允许我提出一些投诉,也许这很有意思,但我想描述:" 为什么会提出这个问题? ".我已经回答问题,不同于其他在这里,这里和这里昨晚.
在深入研究之后,我发现Stream和Collector之间有许多重复的逻辑违反了不重复自己的原则,例如:Stream#map&Collectors#mapping,Stream#filter&Collectors#filtering in jdk-9 and.等等
但似乎合理,因为Stream遵守Tell,不要问原则/ Demeter法和收藏家遵守继承原则.
我只能想到为什么Stream操作与Collector s 重复的几个原因如下:
我们不关心如何在大环境中创建Stream.在这种情况下,Stream操作比Collector更有效和更快,因为它可以简单地将Stream映射到另一个Stream,例如:
consuming(stream.map(...));
consuming(stream.collect(mapping(...,toList())).stream());
void consuming(Stream<?> stream){...}
Run Code Online (Sandbox Code Playgroud)收集器功能更强大,可以将收集器组合在一起收集流中的元素,但Stream只提供一些有用/高度使用的操作.例如:
stream.collect(groupingBy(
..., mapping(
..., collectingAndThen(reducing(...), ...)
)
));
Run Code Online (Sandbox Code Playgroud)