我发现了如下有关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中的每个元素。谁能向我解释一下。
好像发生了这种情况:
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状态:此外,某些操作被认为是短路操作。如果出现无限输入时中间操作可能会产生有限的流,则该中间操作会短路。如果出现无限输入时,端子操作可能会在有限时间内终止,则该端子操作会发生短路。在管道中进行短路操作是处理无限流在有限时间内正常终止的必要条件,但还不够。
将其扩展到有限的流,并且短路操作避免了不必要的流水线步骤的执行,就像您的示例一样。