Java Unordered()函数

时间:2019-06-09 16:33:59

标签: java java-8 java-stream

在Java 8中,当我这样做时,

类型1

list.stream().parallel().map(/**/).unordered().filter(/**/).collect(/**/);

类型2

list.stream().parallel().unordered().map(/**/).filter(/**/).collect(/**/);

由于两个流是并行的,所以我可以理解每个操作(如过滤器,映射等)的所有对象将并行执行,但操作本身将按定义的顺序依次执行。

问题

1。在Type1中,我确实在map()操作之后说了unordered()。那么,map()操作是否尝试处理“排序”,因为它在unOrdered()之前?

2。在Type2中,未在整个地图上维护订购,过滤器操作对吗?我的理解正确吗?

2 个答案:

答案 0 :(得分:4)

有3种Stream状态修改方法:

  • sequential()

      

    返回顺序的等效流。可能会返回自己,这是因为流已经是顺序的,或者是因为基础流状态已修改为顺序的。

  • parallel()

      

    返回并行的等效流。可能会返回自身,可能是因为流已经并行,或者是因为基础流状态已修改为并行。

  • unordered()

      

    返回等效的流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()无效。

以下是文档中一些有用的引语:

Stream Operations

  

直到终端才开始遍历管道源   管道的操作已执行。

因此,所有中间操作的影响都得到了合并,并以输入数据的优化表示形式进行操作。这意味着无论中间操作的顺序如何,它们都会以相同的方式影响整个管道的操作。并行流或顺序流都是如此。

Ordering

  

但是,如果源没有定义的遇到顺序,则任何   值[2,4,6]的排列将是有效的结果。

这与您有关T1(维护订购)的问题有关。在您拥有的管道中,此报价意味着没有任何东西可以维持秩序。