Java 流式处理 allMatch、noneMatch、filter 和 map 的并行行为
Java stream parallel behaviour for allMatch, noneMatch, filter and map
我在另一个 post 中读到,经过调查发现 anyMatch 终端操作的工作方式是每个线程(在子流上操作)定期检查其他线程是否找到结果以及是否所以,所有其他线程都停止了。
我假设,但想知道是否有人可以验证 noneMatch
和 allMatch
是否也以这种方式运行,所以如果当 运行 宁 noneMatch
时,一个线程发现实际匹配,则操作可以 return false。那么,是否所有其他线程都以针对 anyMatch
描述的相同方式定期检查这一点?类似地,倒数是否适用于 allMatch
?
此外,我想知道当 运行 并行执行 filter
和 map
操作时,它们是否 运行 在有序或无序流。在有序流上,我假设最合乎逻辑的好处就是不同的线程可以处理创建的每个子流,然后以相同的顺序将它们全部合并回一起。对于无序流,这对我难以想到的操作有什么优势吗?
所有三个 anyMatch
、allMatch
和 noneMatch
都是使用相同的 MatchOps
class 和不同的标志集实现的。所以他们以非常相似的方式工作。它们都是 short-circuiting 且未排序,因此无论您的流源是否排序都无关紧要:这些操作将同样快速地执行。
map
和 filter
等操作对无序源没有任何好处。无序源改变算法 distinct
, limit
, skip
, takeWhile
(Java-9), dropWhile
(Java -9).似乎正常减少(通过 reduce
或 collect
)不会优化无序情况(尽管我的初步研究表明这种优化是可能的)。
我在另一个 post 中读到,经过调查发现 anyMatch 终端操作的工作方式是每个线程(在子流上操作)定期检查其他线程是否找到结果以及是否所以,所有其他线程都停止了。
我假设,但想知道是否有人可以验证 noneMatch
和 allMatch
是否也以这种方式运行,所以如果当 运行 宁 noneMatch
时,一个线程发现实际匹配,则操作可以 return false。那么,是否所有其他线程都以针对 anyMatch
描述的相同方式定期检查这一点?类似地,倒数是否适用于 allMatch
?
此外,我想知道当 运行 并行执行 filter
和 map
操作时,它们是否 运行 在有序或无序流。在有序流上,我假设最合乎逻辑的好处就是不同的线程可以处理创建的每个子流,然后以相同的顺序将它们全部合并回一起。对于无序流,这对我难以想到的操作有什么优势吗?
所有三个 anyMatch
、allMatch
和 noneMatch
都是使用相同的 MatchOps
class 和不同的标志集实现的。所以他们以非常相似的方式工作。它们都是 short-circuiting 且未排序,因此无论您的流源是否排序都无关紧要:这些操作将同样快速地执行。
map
和 filter
等操作对无序源没有任何好处。无序源改变算法 distinct
, limit
, skip
, takeWhile
(Java-9), dropWhile
(Java -9).似乎正常减少(通过 reduce
或 collect
)不会优化无序情况(尽管我的初步研究表明这种优化是可能的)。