Java8 unordered() 无序化无效

Java8 unordered()无序化无效, 多次运行结果还是与流中元素顺序一致

// 多次运行结果: 5, 1, 2, 6, 3, 7, 4 没有达到无序的效果
Stream.of(5, 1, 2, 6, 3, 7, 4).unordered().forEach(System.out::println);
求大神指教

相关代码


    /**
     * S unordered(); 产生一个与当前流中元素相同的无序流, 当流本身就是无序或流已经无序, 会返回流本身
     */
    @Test
    public void unorderedTest() {
        Stream.of(5, 1, 2, 6, 3, 7, 4).forEach(System.out::println);
        
        // 多次运行结果: 5, 1, 2, 6, 3, 7, 4 没有达到无序的效果 TODO
        Stream.of(5, 1, 2, 6, 3, 7, 4).unordered().forEach(System.out::println);
    }

阅读 3.1k
1 个回答

unordered()操作不会执行任何操作来显式地对流进行排序。它的作用是消除了流必须保持有序的约束,从而允许后续操作使用不必考虑排序的优化。

您可以在Java 8文档中阅读此内容:

对于顺序流,顺序的存在与否不会影响性能,只影响确定性。如果流是顺序的,则在相同的源上重复执行相同的流管道将产生相同的结果;
如果是非顺序流,重复执行可能会产生不同的结果。 对于并行流,放宽排序约束有时可以实现更高效的执行。 ...

在流有序时, 但用户不特别关心该顺序的情况下,使用 unordered 明确地对流进行去除有序约束可以改善某些有状态或终端操作的并行性能。

可以比较下面的结果

   Stream.of(5, 1, 2, 6, 3, 7, 4).unordered().forEach(System.out::println);
   Stream.of(5, 1, 2, 6, 3, 7, 4).unordered().parallel().forEach(System.out::println);
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏