Java 流式处理 allMatch、noneMatch、filter 和 map 的并行行为

Java stream parallel behaviour for allMatch, noneMatch, filter and map

我在另一个 post 中读到,经过调查发现 anyMatch 终端操作的工作方式是每个线程(在子流上操作)定期检查其他线程是否找到结果以及是否所以,所有其他线程都停止了。

我假设,但想知道是否有人可以验证 noneMatchallMatch 是否也以这种方式运行,所以如果当 运行 宁 noneMatch 时,一个线程发现实际匹配,则操作可以 return false。那么,是否所有其他线程都以针对 anyMatch 描述的相同方式定期检查这一点?类似地,倒数是否适用于 allMatch

此外,我想知道当 运行 并行执行 filtermap 操作时,它们是否 运行 在有序或无序流。在有序流上,我假设最合乎逻辑的好处就是不同的线程可以处理创建的每个子流,然后以相同的顺序将它们全部合并回一起。对于无序流,这对我难以想到的操作有什么优势吗?

所有三个 anyMatchallMatchnoneMatch 都是使用相同的 MatchOps class 和不同的标志集实现的。所以他们以非常相似的方式工作。它们都是 short-circuiting 且未排序,因此无论您的流源是否排序都无关紧要:这些操作将同样快速地执行。

mapfilter 等操作对无序源没有任何好处。无序源改变算法 distinct, limit, skip, takeWhile (Java-9), dropWhile (Java -9).似乎正常减少(通过 reducecollect)不会优化无序情况(尽管我的初步研究表明这种优化是可能的)。