相关疑难解决方法(0)

如何确保java8流中的处理顺序?

我想处理XMLjava对象中的列表.我必须确保按顺序处理所有元素.

因此sequential,stream我应该每次使用我吗? list.stream().sequential().filter().forEach()

或者只要我不使用并行性就足以使用流? list.stream().filter().forEach()

java java-8 java-stream

130
推荐指数
2
解决办法
7万
查看次数

遇到订单友好/不友好的终端操作与并行/顺序与有序/无序流

这个问题的启发,我开始玩有序与无序流,并行与顺序流和终端操作,这些操作尊重遭遇顺序与不尊重它的终端操作.

在对链接问题的一个答案中,显示了与此类似的代码:

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(...)是强制遭遇秩序的特定收集者吗?

java java-8 java-stream

8
推荐指数
1
解决办法
128
查看次数

为什么排序操作将遇到顺序强加给流?

排序操作的文档说:

对于有序流,排序是稳定的。对于无序流,没有稳定性保证。

页面总结说:

一些中间操作,例如 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)

java java-stream

7
推荐指数
1
解决办法
275
查看次数

java流中遇到顺序保存

我已经解决了相关问题,例如如何确保 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 特性的评估是否在执行开始之前通过源、中间操作和终端操作的特性完成?

java java-8 java-stream

3
推荐指数
1
解决办法
1013
查看次数

标签 统计

java ×4

java-stream ×4

java-8 ×3