gpt4 book ai didi

java - 有序流处理元素的状态映射操作是否以确定性方式进行?

转载 作者:搜寻专家 更新时间:2023-11-01 01:24:41 25 4
gpt4 key购买 nike

我正在阅读有关 java 流 API 的信息,我遇到了以下 here :

The operation forEachOrdered processes elements in the order specified by the stream, regardless of whether the stream is executed in serial or parallel. However, when a stream is executed in parallel, the map operation processes elements of the stream specified by the Java runtime and compiler. Consequently, the order in which the lambda expression e -> { parallelStorage.add(e); return e; } adds elements to the List parallelStorage can vary every time the code is run. For deterministic and predictable results, ensure that lambda expression parameters in stream operations are not stateful.

我测试了下面的代码,事实上,它的工作原理和上面提到的一样:

public class MapOrdering {

public static void main(String[] args) {
// TODO Auto-generated method stub
List < String > serialStorage = new ArrayList < > ();

System.out.println("Serial stream:");
int j = 0;
List < String > listOfIntegers = new ArrayList();
for (int i = 0; i < 10; i++) listOfIntegers.add(String.valueOf(i));

listOfIntegers.stream().parallel().map(e - > {
serialStorage.add(e.concat(String.valueOf(j)));
return e;
}).forEachOrdered(k - > System.out.println(k));;
/*
// Don't do this! It uses a stateful lambda expression.
.map(e -> { serialStorage.add(e); return e; })*/

for (String s: serialStorage) System.out.println(s);
}
}

输出

Serial stream: 0 1 2 3 4 5 6 7 8 9 null null 80 90 50 40 30 00

问题:

  1. 每次运行时输出都会改变。如何确保有状态映射操作按顺序执行。
  2. map 是一个中间操作,它只开始处理元素直到终端运行开始。由于终端操作是有序,为什么 map 操作无序,并且往往会改变结果每次使用有状态操作时?

最佳答案

幸运看到 serialStorage 拥有您认为它会拥有的所有元素,毕竟您是从多个线程向一个非- 线程安全 集合ArrayList。您可能很容易看到 null 或不包含所有元素的 List。但是,即使您添加了一个线程安全的 List - 在该 List 中绝对没有您可以依赖的顺序。

这在副作用 下的文档中明确提到,中间操作应该没有副作用。

基本上有两种顺序:处理顺序(中间操作)和遇到顺序。最后一个被保留(如果它以一个开头并且流中间操作不会破坏它 - 例如 unorderedsorted)。

未指定处理顺序,这意味着所有中间操作都将按照他们认为的任何顺序处理元素。遇到订单(您从终端操作中看到的订单)将保留初始订单。

但即使是终端操作也不必保留初始顺序,例如 forEachforEachOrdered 或当您收集到 Set 时;当然看文档,它通常会清楚地说明这方面。

关于java - 有序流处理元素的状态映射操作是否以确定性方式进行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51987021/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com