JAVA秩序函数,如何确保java8流中的处理顺序?

问题

我想处理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()

那么其余的操作就不能保证订单。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值