问题
我想处理anXMLjava对象中的列表。我必须确保按照收到的顺序处理所有元素。
因此,我应该致电sequential,每个stream我使用?list.stream().sequential().filter().forEach()
或者只要我不使用并行性就足以使用流?list.stream().filter().forEach()
#1 热门回答(230 赞)
你问的是错误的问题。你问的是sequentialvs.parallel你想要按顺序处理项目,所以你必须询问有关订购的问题。如果你有anorderedstream并执行保证维护订单的操作,则无论是并行还是顺序处理流都无关紧要;实施将维持秩序。
有序属性不同于并行和顺序。例如。如果你致电stream()on aHashSet,则在调用stream() aList返回有序流时,流将无序。请注意,你可以致电unordered()以下达订购合同并可能提高性能。一旦流没有排序,就无法重新建立排序。 (将无序流转换为有序的唯一方法是调用sorted,但是,生成的顺序不一定是原始顺序)。
另请参阅java.util.stream包文档的"Ordering" section。
为了确保在整个流操作中维护订购,你必须研究流的源,所有中间操作和终端操作的文档,以确定它们是否维护订单(或者源是否在第一个订单中有订单)地点)。
这可能非常微妙,例如.Stream.iterate(T,UnaryOperator)创建有序流,而Stream.generate(Supplier)创建anunorderedstream。请注意,你在问题中也犯了一个常见的错误,因为4672907998不能保持订购。如果要以保证顺序处理流的元素,则必须使用forEachOrdered。
因此,如果你的问题中的yourlist确实是ajava.util.List,则其stream()方法将返回anorderedstream而且filter将不会更改排序。因此,如果你调用list.stream().filter() .forEachOrdered(),则将按顺序依次处理所有元素,而对于list.parallelStream().filter().forEachOrdered(),可以并行处理元素(例如,通过过滤器),但仍将按顺序调用终端操作(这显然会降低并行执行的好处)。
例如,如果你使用类似的操作
List result=inputList.parallelStream().map(…).filter(…).collect(Collectors.toList());
整个操作可能会受益于并行执行,但无论你使用并行还是顺序流,结果列表将始终按正确的顺序排列。
#2 热门回答(2 赞)
list.stream()。sequential()。filter()。forEach()
将按顺序处理列表,因为列表本身是有序的。
但是,如果我们使用
list.stream()。parallel()
那么其余的操作就不能保证订单。