请允许我提出一些抱怨,也许它是无聊的,但我想描述:“为什么会提出这个问题?”。 昨天晚上我回答了不同的问题here,here和here。为什么Stream操作与收集器重复?
后,我得到钻研它,我发现有Stream和Collector违反Don't repeat yourself原则,e.g之间有许多重复的逻辑:在JDK-9和.etc Stream#map & Collectors#mapping,Stream#filter & Collectors#filtering。
但似乎合理的,因为Stream遵守Tell, Don't ask原理/ Law of Demeter和Collector通过Composition over Inheritance遵守的原则。
为什么Stream操作与Collector重复我只能想到的几个原因S作为如下:
我们不关心的Stream是如何在一个大的背景下产生。在这种情况下Stream操作更有效和比Collector更快,因为它可以映射Stream到另一个Stream简单地,例如:
consuming(stream.map(...)); consuming(stream.collect(mapping(...,toList())).stream()); void consuming(Stream<?> stream){...}
Collector是更强大,罐构成Collectorš在一起以收集元件在流但是,Stream仅提供一些有用/高度使用的操作。例如:
stream.collect(groupingBy( ..., mapping( ..., collectingAndThen(reducing(...), ...) ) ));
Stream操作比Collector更表现做一些简单的工作的时候,但他们更慢于Collector小号,因为它会为每个操作创建一个新的数据流和Stream比更重的和抽象Collector。例如:
stream.map(...).collect(collector); stream.collect(mapping(..., collector));
-
stream.filter(...).findFirst();
有谁可以想出其他不利因素/优势为什么流业务被复制在这里收藏家?我想重新理解它们。提前致谢。
因为这是他们设计它的方式。如果您有投诉,请提交错误报告或改进请求,或者聘请一个大厅。 – EJP
另请参见[Collectors.summingInt()vs mapToInt().sum()](https://stackoverflow.com/q/37023822/2711488) – Holger
@Holger感谢您的链接,我花费大部分时间来理解因为我不擅长英语。 –