peek()和allMatch()如何在Java 8 Stream API中一起工作

问题描述 投票:2回答:4

我发现了如下有关peek方法的Java 8 Stream API的测验

Arrays.asList("Fred", "Jim", "Sheila")
      .stream()
      .peek(System.out::println)
      .allMatch(s -> s.startsWith("F"));

输出为

Fred
Jim

我很困惑此流的工作原理?我的预期结果应该是

Fred
Jim
Sheila

peek()方法是一个中间操作,它处理Stream中的每个元素。谁能向我解释一下。

java java-8 java-stream
4个回答
5
投票
intermediate操作,因为在知道最终结果时执行这些操作没有意义。

好像发生了这种情况:

take"Fred" peek("Fred") evaluate("Fred".startsWith("F")) decide whether the result of allMatch() is known for sure: Not yet take"Jim" peek("Jim") evaluate("Jim".startsWith("F")) decide whether the result of allMatch() is known for sure: Yes

评估"Jim".startsWith("F")时,可以肯定allMatch(s -> s.startsWith("F"))的结果。 "Jim"之后管道中出现什么值都没关系,我们知道

所有以“ F”开头的值是

false

这并不特定于peek / allMatch组合,存在多个中间和端子短路操作。 java.util.stream package's docs状态:

此外,某些操作被认为是短路操作。如果出现无限输入时中间操作可能会产生有限的流,则该中间操作会短路。如果出现无限输入时,端子操作可能会在有限时间内终止,则该端子操作会发生短路。在管道中进行短路操作是处理无限流在有限时间内正常终止的必要条件,但还不够。

将其扩展到有限的流,并且短路操作避免了不必要的流水线步骤的执行,就像您的示例一样。

3
投票

2
投票

0
投票
© www.soinside.com 2019 - 2024. All rights reserved.