在java 8中,当我这么做的时候,
类型1
list.stream().parallel().map(/**/).unordered().filter(/**/).collect(/**/);类型2
list.stream().parallel().unordered().map(/**/).filter(/**/).collect(/**/);由于这两个流都是并行的,我可以理解每个操作的所有对象,如filter、map等。将以并行方式执行,但操作本身将按定义的顺序顺序执行。
问题
1.在Type1中,我确实说map()操作后无序()。那么,map()操作是否尝试处理“排序”,因为它在unOrdered()之前?
2.在Type2中,地图之间没有保持顺序,过滤操作对吗?我的理解正确吗?
发布于 2019-06-09 17:02:52
有3种Stream状态修改方法:
sequential()
返回顺序相同的流。可能会返回自己,原因要么是流已经是顺序的,要么是因为底层流状态被修改为顺序的。parallel()
返回并行的等效流。可能返回自身,原因是流已经并行,或者因为底层流状态被修改为并行的。unordered()
返回一个等价的流,即无序。可能返回自身,原因是流已经无序,或者因为底层流状态被修改为无序的。正如您所看到的,这三种方法都可能修改底层流状态,这意味着方法链中的位置并不重要。
你的两个例子是一样的。这些会否是:
list.stream().parallel().map(/**/).filter(/**/).unordered().collect(/**/);
list.stream().map(/**/).filter(/**/).unordered().parallel().collect(/**/);
list.stream().unordered().map(/**/).parallel().filter(/**/).collect(/**/);
list.stream().unordered().parallel().map(/**/).filter(/**/).collect(/**/);您应该点击无序链接并阅读javadoc来了解更多关于流排序的信息。
发布于 2019-06-09 17:22:09
.unordered()的效果是只删除它必须保持有序的流上的约束。因此,管道中的任何中间操作都不受排序约束的影响。在提供的示例中,假设每个操作的内部操作都不是有状态操作,则.unordered()没有任何效果。
以下是文档中一些有用的引号:
在执行管道的终端操作之前,管道源的遍历不会开始。
因此,所有中间操作的效果都是统一的,并且操作在输入数据的优化表示上。这意味着,无论中间操作的顺序如何,它们都以相同的方式影响管道的整个操作。对于并行或顺序流来说,这是正确的。
但是,如果源没有定义的相遇顺序,那么值2、4、6的任何排列都将是有效的结果。
这与您有关T1 (维持订单)的问题有关。在你所拥有的管道中,这个引号意味着没有任何东西能维持秩序。
https://stackoverflow.com/questions/56516407
复制相似问题