在java 8中,当我这样做时,
类型 1
list.stream().parallel().map(/**/).unordered().filter(/**/).collect(/**/);
类型 2
list.stream().parallel().unordered().map(/**/).filter(/**/).collect(/**/);
由于两个流都是并行的,我可以理解每个操作(如过滤器、映射等)的所有对象都将并行执行,但操作本身将按定义的顺序顺序执行。
问题
1.In Type1,我在 map() 操作后确实说无序()。那么,map() 操作是否尝试处理"排序",因为它在 unOrdered() 之前?
2.In Type2,整个地图不维护排序,过滤操作对吗?我的理解正确吗?
有 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 以了解有关流排序的更多信息。
.unordered()
的效果是仅删除流上必须保持有序的约束。因此,管道中的任何中间操作都不受排序约束的影响。在提供的示例中,假设每个操作的内部操作不是有状态操作,则.unordered()
不起作用。
以下是文档中的一些有用引用:
流操作:
管道源的遍历直到终端才开始 执行管道的操作。
因此,中间操作的所有影响都经过合并,并基于输入数据的优化表示进行操作。这意味着无论中间操作的顺序如何,它们都以相同的方式影响管道的整个操作。对于并行或顺序流也是如此。
订购:
但是,如果源没有定义的遭遇顺序,则任何 值 [2, 4, 6] 的排列将是一个有效的结果。
这与你关于T1(保持排序)的问题有关。在你拥有的管道中,这句话意味着没有什么可以维持秩序。