Java Unordered() function



在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(保持排序)的问题有关。在你拥有的管道中,这句话意味着没有什么可以维持秩序。

最新更新