为什么 takeWhile 是有状态的?

Hel*_*rld 3 java java-8 java-stream

Javadoc中指出,

这是一个短路状态中间操作。

Javadoc中 stateful 的定义:

在处理新元素时,有状态的操作,例如distinct 和sorted,可能会合并以前看到的元素的状态。有状态操作可能需要在产生结果之前处理整个输入。例如,在看到流的所有元素之前,无法通过对流进行排序来产生任何结果。因此,在并行计算下,一些包含有状态中间操作的管道可能需要对数据进行多次传递或可能需要缓冲重要数据。包含完全无状态中间操作的管道可以在单程中处理,无论是顺序还是并行,数据缓冲最少。

如何是default Stream<T> takeWhile?(Predicate<? super T> predicate)有状态的?它不需要查看整个输入等...

这几乎就像是filter短路。

Era*_*ran 10

那么,takeWhile应该处理Stream满足给定的的最长前缀Predicate。这意味着为了知道 的给定元素Stream是否应该由 处理takeWhile,您可能必须处理它之前的所有元素。

因此,您需要知道之前元素的处理状态,Stream才能知道如何处理当前元素。

在顺序Streams 中,您不必保持状态,因为一旦到达与 不匹配的第一个元素Predicate,您就知道已完成。

Stream然而,在并行s 中,这变得更加棘手。


Hul*_*ulk 6

它是有状态的,因为它根据内部状态(是否已经看到与谓词匹配的元素)更改其行为。它不会相互独立地处理元素。这可能会禁用某些优化并可能降低并行处理的有用性。

所以它以同样的方式是有状态的limit并且skip是有状态的 - 结果不仅(仅)取决于当前元素,还取决于它之前的元素。