我在另一篇文章中读到,经过调查后发现,anyMatch终端操作的工作方式是,每个线程(在子流上操作)定期检查其他线程是否已找到结果,如果这样,则所有其他线程都将停止。

我假设,但想知道是否有人可以验证noneMatchallMatch是否也以这种方式操作,因此,如果在运行noneMatch时,一个线程找到了实际匹配项,则该操作可以返回false。那么,所有其他线程是否以针对anyMatch所述的相同方式定期检查此内容?相似地,倒数是否适用于allMatch

此外,我想知道在并行运行filtermap操作时是否在有序流或无序流上运行是否有任何区别。在有序流上,我认为最合乎逻辑的好处是,不同的线程可以处理创建的每个子流,然后以相同顺序将它们全部合并回去。对于无序流,这是否对我正在努力思考的操作具有任何优势?

最佳答案

这三个anyMatchallMatchnoneMatch都是使用相同的 MatchOps 类(设置了不同的标志)实现的。因此,它们以非常相似的方式工作。所有这些都是短路的并且没有顺序,因此您的流源是否顺序无所谓:这些操作将以同样快的速度执行。

mapfilter这样的操作对无序源代码没有任何好处。无序源会更改distinctlimitskiptakeWhile(Java-9)和dropWhile(Java-9)的算法。似乎正常的归约(通过reducecollect)不能优化无序情况(尽管我的初步研究表明这样的优化是可能的)。

10-08 16:10