allMatch,noneMatch,filter和map

时间:2016-01-21 12:35:36

标签: performance parallel-processing java-8 java-stream behavior

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

我假设,但想知道是否有人可以验证noneMatchallMatch是否也以这种方式运行,因此如果在运行noneMatch时,一个线程找到实际匹配,那么操作可以返回false。那么所有其他线程是否会以anyMatch所述的相同方式定期检查此问题?同样,反向适用allMatch

此外,我想知道在并行运行filtermap操作时是否存在任何差异,无论它们是在有序流还是无序流上运行。在有序流上,我假设最合乎逻辑的好处是,不同的线程可以处理创建的每个子流,然后以相同的顺序将它们全部合并在一起。对于无序流,这对于我正在努力想到的任何操作都有利吗?

1 个答案:

答案 0 :(得分:6)

所有三个anyMatchallMatchnoneMatch都是使用设置了不同标志的相同MatchOps类实现的。所以他们以非常相似的方式工作。所有这些都是短路的而且没有订购,因此无论您的流源是否有序都无关紧要:这些操作的执行速度同样快。

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