我在另一篇文章中读到,调查后发现anyMatch终端操作的工作方式是每个线程(在子流上操作)定期检查其他线程是否找到了结果,如果是,所有其他线程都是停止。
我假设,但想知道是否有人可以验证noneMatch
和allMatch
是否也以这种方式运行,因此如果在运行noneMatch
时,一个线程找到实际匹配,那么操作可以返回false。那么所有其他线程是否会以anyMatch
所述的相同方式定期检查此问题?同样,反向适用allMatch
?
此外,我想知道在并行运行filter
和map
操作时是否存在任何差异,无论它们是在有序流还是无序流上运行。在有序流上,我假设最合乎逻辑的好处是,不同的线程可以处理创建的每个子流,然后以相同的顺序将它们全部合并在一起。对于无序流,这对于我正在努力想到的任何操作都有利吗?
答案 0 :(得分:6)
所有三个anyMatch
,allMatch
和noneMatch
都是使用设置了不同标志的相同MatchOps
类实现的。所以他们以非常相似的方式工作。所有这些都是短路的而且没有订购,因此无论您的流源是否有序都无关紧要:这些操作的执行速度同样快。
map
和filter
等操作对无序源没有任何好处。无序源会更改distinct
,limit
,skip
,takeWhile
(Java-9),dropWhile
(Java-9)的算法。似乎正常的减少(通过reduce
或collect
)并没有优化无序的情况(尽管我的初步研究表明这样的优化是可能的)。