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

成员声音:

我想处理XMLJava对象中的列表我必须确保处理所有元素,以便收到它们。

因此sequentialstream应该呼吁使用的每一个吗?list.stream().sequential().filter().forEach()

还是只要不使用并行性就足以使用流? list.stream().filter().forEach()

霍尔格:

您在问错问题。您要询问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());

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章