我想处理XMLjava对象中的列表.我必须确保按顺序处理所有元素.
因此sequential,stream我应该每次使用我吗?
list.stream().sequential().filter().forEach()
或者只要我不使用并行性就足以使用流?
list.stream().filter().forEach()
受这个问题的启发,我开始玩有序与无序流,并行与顺序流和终端操作,这些操作尊重遭遇顺序与不尊重它的终端操作.
在对链接问题的一个答案中,显示了与此类似的代码:
List<Integer> ordered = Arrays.asList(
1, 2, 3, 4, 4, 3, 2, 1, 1, 2, 3, 4, 4, 3, 2, 1, 1, 2, 3, 4);
List<Integer> result = new CopyOnWriteArrayList<>();
ordered.parallelStream().forEach(result::add);
System.out.println(ordered);
System.out.println(result);
Run Code Online (Sandbox Code Playgroud)
这些名单确实不同.该unordered列表甚至从一次运行变为另一次运行,表明结果实际上是非确定性的.
所以我创建了另一个例子:
CopyOnWriteArrayList<Integer> result2 = ordered.parallelStream()
.unordered()
.collect(Collectors.toCollection(CopyOnWriteArrayList::new));
System.out.println(ordered);
System.out.println(result2);
Run Code Online (Sandbox Code Playgroud)
我希望看到类似的结果,因为流是并行和无序的(可能unordered()是多余的,因为它已经是并行的).但是,生成的列表是有序的,即它等于源列表.
所以我的问题是为什么收集的清单是有序的?是否collect总是尊重遭遇顺序,即使对于并行,无序的流?它Collectors.toCollection(...)是强制遭遇秩序的特定收集者吗?
排序操作的文档说:
对于有序流,排序是稳定的。对于无序流,没有稳定性保证。
和页面总结说:
一些中间操作,例如 sorted(),可能会强加遇到顺序
有人可以解释为什么sorted操作需要对 Stream 的遇到顺序(我没有看到遇到顺序的存在与排序操作之间的关系)?
这是否意味着以下代码无效(因为 HashSet 不是本质上有序的)?
Set<Integer> mySet = new HashSet<>();
mySet.add(10);
mySet.add(4);
mySet.add(20);
mySet.add(15);
mySet.add(22);
mySet.add(-3);
List<Integer> result = mySet.stream().sorted().collect(Collectors.toList());
System.out.println(result);
Run Code Online (Sandbox Code Playgroud)
当我运行这段代码时,它总是给我相同的输出 [-3, 4, 10, 15, 20, 22]
事件如果我使用.parrallel(),输出保持不变[-3, 4, 10, 15, 20, 22]
mySet.stream().parallel().sorted().collect(Collectors.toList());`
Run Code Online (Sandbox Code Playgroud) 我已经解决了相关问题,例如如何确保 java8 流中的处理顺序?,我仍然不完全清楚输出元素的顺序。因此,请澄清我的以下疑问。
Integer[] intArray = {1, 2, 3, 4, 5, 6, 7, 8 };
List<Integer> listOfIntegers =
new ArrayList<>(Arrays.asList(intArray));
listOfIntegers
.parallelStream()
.unordered()
.forEachOrdered(e -> System.out.print(e + " "));
Run Code Online (Sandbox Code Playgroud)
我认为至少在理论上(或根据 java 规范)它可以按比 1、2、3、4、5、6、7、8 的随机顺序打印。我说得对吗?
还有一个相关的问题——相遇顺序保留的决定是在什么执行点做出的?更准确地说 - 整个流管道 ORDER 特性的评估是否在执行开始之前通过源、中间操作和终端操作的特性完成?