在Java 8中,当我这样做时,
list.stream().parallel().map(/**/).unordered().filter(/**/).collect(/**/);
list.stream().parallel().unordered().map(/**/).filter(/**/).collect(/**/);
由于两个流是并行的,所以我可以理解每个操作(如过滤器,映射等)的所有对象将并行执行,但操作本身将按定义的顺序依次执行。
1。在Type1中,我确实在map()操作之后说了unordered()。那么,map()操作是否尝试处理“排序”,因为它在unOrdered()之前?
2。在Type2中,未在整个地图上维护订购,过滤器操作对吗?我的理解正确吗?
答案 0 :(得分:4)
有3种Stream
状态修改方法:
返回顺序的等效流。可能会返回自己,这是因为流已经是顺序的,或者是因为基础流状态已修改为顺序的。
返回并行的等效流。可能会返回自身,可能是因为流已经并行,或者是因为基础流状态已修改为并行。
返回等效的流unordered。可能会返回自身,可能是因为流已经无序,或者是因为基础流状态已修改为无序。
如您所见,这三个都可以修改基础流状态,这意味着方法在流链中的位置无关紧要。
您的两个示例是 same 。所以这些是:
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(/**/);
您应该单击unordered链接并阅读Javadoc,以了解有关流的排序的更多信息。
答案 1 :(得分:3)
.unordered()
的作用是消除对必须保持有序流的约束。因此,管道中的任何中间操作都不受 ordering 约束的影响。在提供的示例中,假设每个内部操作都不是有状态操作,则.unordered()
无效。
以下是文档中一些有用的引语:
直到终端才开始遍历管道源 管道的操作已执行。
因此,所有中间操作的影响都得到了合并,并以输入数据的优化表示形式进行操作。这意味着无论中间操作的顺序如何,它们都会以相同的方式影响整个管道的操作。并行流或顺序流都是如此。
但是,如果源没有定义的遇到顺序,则任何 值[2,4,6]的排列将是有效的结果。
这与您有关T1(维护订购)的问题有关。在您拥有的管道中,此报价意味着没有任何东西可以维持秩序。