为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕神8447489 2019-07-22 19:53:39
如何确保java 8流中的处理顺序?我想在XMLJava对象。我必须确保处理所有的元素,以便我收到它们。因此,我应该打电话给你吗?sequential每一个stream我用?list.stream().sequential().filter().forEach()还是只要我不使用并行性,就只使用流就足够了?list.stream().filter().forEach()
查看完整描述

3 回答

?
慕码人2483693

TA贡献1860条经验 获得超9个赞

你问错问题了。你在问sequentialv.V.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());

整个操作可能从并行执行中受益,但结果列表将始终保持正确的顺序,而不管您使用的是并行流还是顺序流。


查看完整回答
反对 回复 2019-07-22
?
交互式爱情

TA贡献1712条经验 获得超3个赞

list.stream().序贯().filter().forEach()

将始终按照列表本身的顺序处理列表。

但是如果我们用

list.stream().并行()

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


查看完整回答
反对 回复 2019-07-22
?
守着星空守着你

TA贡献1799条经验 获得超8个赞

这取决于实际的集合类型。SetS通常不会,除非它是SortedSetLinkedHashSet..的集合视图。Map (keySet()entrySet(),和values())继承Map的策略,即当地图是SortedMapLinkedHashMap..的行为是由报告的特征决定的。集合分配器..这个default执行Collection不报告ORDERED特征,所以它是无序的,除非被覆盖。

查看完整回答
反对 回复 2019-07-22
  • 3 回答
  • 0 关注
  • 995 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信