如何确保java8流中的处理顺序?

如何确保java8流中的处理顺序?,第1张

如何确保java8流中的处理顺序

你在问错问题。你正在询问

sequentialvs. parallel
而要按顺序处理项目,因此你必须询问订购。如果你有顺序的流并执行保证维持顺序的 *** 作,则该流是并行处理还是顺序处理都没有关系;实施将维持秩序。

有序属性不同于并行与顺序。例如,如果你调用

stream()
一个
HashSet
同时调用流将是无序
stream()
在List返回的有序流。请注意,你可以致电
unordered()
以解除订购合同并可能提高性能。一旦流没有排序,就无法重新建立排序。(将无序流变成有序流的唯一方法是调用sorted,但是,生成的顺序不一定是原始顺序)。

又见“订购”一节中的

java.util.stream
包文档。

为了确保在整个流 *** 作中维持顺序,你必须研究流源,所有中间 *** 作和终端 *** 作的文档,以了解它们是否维持顺序(或者源是否在第一顺序中具有顺序)地点)。

这可能非常微妙,例如,

Stream.iterate(T,UnaryOperator)
创建有序流而
Stream.generate(Supplier)
创建无序流。请注意,你在问题中也犯了一个常见错误,因为它不维护顺序。如果要以保证的顺序处理流的元素,则必须使用。
forEach forEachOrdered

因此,如果你list的问题确实是

java.util.List
,则其
stream()
方法将返回有序流,并且filter不会更改顺序。因此,如果调用
list.stream().filter() .forEachOrdered()
,则将按顺序顺序处理所有元素,而对于
list.parallelStream().filter().forEachOrdered()
元素,则可能会并行处理(例如,通过过滤器),但仍将按顺序调用终端 *** 作(显然会降低并行执行的好处) 。

例如,如果你使用类似

List<…> result=inputList.parallelStream().map(…).filter(…).collect(Collectors.toList());

整个 *** 作可能会受益于并行执行,但是无论你使用并行流还是顺序流,结果列表始终会以正确的顺序排列。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/4946101.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-13
下一篇 2022-11-13

发表评论

登录后才能评论

评论列表(0条)

保存