中间操作和终端操作有什么区别?

新手上路,请多包涵

有人能告诉我 Stream 的中间操作和终端操作有什么区别吗?

Stream 操作组合成流水线来处理流。所有操作要么是中间操作,要么是终端操作……是什么意思?

原文由 Amol Raje 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 748
2 个回答

Stream支持多种操作,这些操作分为 intermediateterminal 操作。

这些操作之间的区别在于中间操作是惰性的,而终端操作不是。当您在流上调用中间操作时,该操作不会立即执行。它仅在对该流调用终端操作时执行。在某种程度上,中间操作会被记住,并在调用终端操作时立即调用。您可以链接多个中间操作,并且在您调用终端操作之前,它们都不会执行任何操作。那时,您之前调用的所有中间操作都将与终端操作一起调用。

所有中间操作都返回 Stream(可以链接),而终端操作则不会。中间操作是:

 filter(Predicate<T>)
map(Function<T>)
flatMap(Function<T>)
sorted(Comparator<T>)
peek(Consumer<T>)
distinct()
limit(long n)
skip(long n)

终端操作产生非流(无法链接)结果,例如原始值、集合或根本没有值。

终端操作是:

 forEach
forEachOrdered
toArray
reduce
collect
min
max
count
anyMatch
allMatch
noneMatch
findFirst
findAny

最后5个是短路端子操作。

原文由 Alex Mamo 发布,翻译遵循 CC BY-SA 4.0 许可协议

根据 javadoc

  • 中间操作 会将一个流转换为另一个流,例如 map(MapperFn)filter(Predicate)
  • 终端操作 会产生一个结果或副作用,例如 count()forEach(Consumer)

请注意,如果最后没有终端操作,将 不会 执行所有中间操作。所以模式将是:

 stream()
    .intemediateOperation1()
    .intemediateOperation2()
    ...
    .intemediateOperationN()
    .terminalOperation();

原文由 Hoa Nguyen 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题