【发布时间】:2017-05-30 09:42:35
【问题描述】:
请允许我提出一些抱怨,也许这很无聊,但我想描述一下:“为什么会提出这个问题?”。 我昨晚回答的问题和别人here、here和here不同。
深入研究后发现Stream和Collector之间有很多重复的逻辑,违反Don't repeat yourself原则,例如:Stream#map&Collectors#mapping,Stream#filter&Collectors#filtering在jdk-9 和 .etc.
但Stream遵守Tell, Don't ask原则/Law of Demeter和Collector遵守Composition over Inheritance原则似乎是合理的。
我只能想到Stream操作与Collectors重复的几个原因如下:
-
我们不关心Stream 是如何在大上下文中创建的。在这种情况下,Stream 操作比Collector 更有效和更快,因为它可以简单地将Stream 映射到另一个Stream,例如:
consuming(stream.map(...)); consuming(stream.collect(mapping(...,toList())).stream()); void consuming(Stream<?> stream){...} -
Collector 更强大,可以将Collectors 组合在一起以收集流中的元素,但是,Stream 仅提供一些有用/高度使用的操作。例如:
stream.collect(groupingBy( ..., mapping( ..., collectingAndThen(reducing(...), ...) ) )); -
Stream 操作在做一些简单的工作时比Collector 更具表现力,但它们比Collectors 更慢,因为它会为每个操作创建一个新流并且Stream 比Stream 更重和更抽象Collector。例如:
stream.map(...).collect(collector); stream.collect(mapping(..., collector)); -
Collector 不能像Stream 那样应用短路终端操作。例如:
stream.filter(...).findFirst();
有没有人能提出其他缺点/优点,为什么 Stream 操作在这里与 Collectors 重复?我想重新理解他们。提前致谢。
【问题讨论】:
-
因为他们就是这样设计的。如果您有投诉,请提交错误报告或改进请求,或租用大厅。
-
@Holger 感谢您的链接,因为我不擅长英语,所以我花了大部分时间来理解您的答案。
-
@EJP 先生,也许你误会了我。我所说的是我想澄清为什么会提出这个问题。抱怨不是抱怨。
标签: java java-8 java-stream