如何确保 java8 流中的处理顺序?
问题描述:
我想处理XML
java 对象中的列表。我必须确保处理所有元素才能收到它们。
因此,我应该调用sequential
每个stream
我使用的吗?
list.stream().sequential().filter().forEach()
或者只要我不使用并行性就足以使用流? list.stream().filter().forEach()
第 1 个答案:
你问错问题了。你问的是sequential
vs.parallel
而你想 按顺序 处理项目,所以你必须问关于 ordering
的问题。如果您有一个 有序 流并执行保证保持顺序的操作,那么流是并行处理还是顺序处理都无关紧要;执行将维持秩序。
有序属性不同于并行与顺序。例如,如果您调用stream()
aHashSet
流将是无序的,而调用stream()
aList
返回有序流。请注意,您可以调用unordered()
以释放订购合同并可能提高性能。一旦流没有排序,就无法重新建立排序。(将无序流转换为有序流的唯一方法是调用sorted
,但是生成的顺序不一定是原始顺序)。
另请参阅包文档的“订购”部分。java.util.stream
为了确保在整个流操作中保持顺序,您必须研究流的源,所有中间操作和终端操作的文档,以了解它们是否保持顺序(或源是否有顺序)第一名)。
这可能非常微妙,例如在创建
无序Stream.iterate(T,UnaryOperator)
流的同时Stream.generate(Supplier)
创建有序流。请注意,您在问题中也犯了一个常见错误,因为 不
保持顺序。如果您想以保证的顺序处理流的元素,则必须使用。
forEach
forEachOrdered
因此,如果您list
的问题确实是 a java.util.List
,它的stream()
方法将返回一个 有序
流并且filter
不会更改排序。因此,如果您调用list.stream().filter()
.forEachOrdered()
,所有元素将按顺序依次处理,而对于list.parallelStream().filter().forEachOrdered()
元素可能会并行处理(例如通过过滤器),但终端操作仍将按顺序调用(这显然会降低并行执行的好处)
.
例如,如果您使用类似的操作
List<鈥�> result=inputList.parallelStream().map(鈥�).filter(鈥�).collect(Collectors.toList());
整个操作可能会从并行执行中受益,但无论您使用并行还是顺序流,结果列表将始终处于正确的顺序。
我喜欢string.IsNullOrEmpty方法。我很想拥有一些允许 IEnumerable具有相同功能的东西。有这样的吗?也许一些收集助手类?我问的原因是,在if语句中,如果模式 ...