为什么无序顺序流总是在不应该返回时向我返回相同的内容?


List<Integer> list = new ArrayList<>();
for (int i = 0; i < 100_000_000; i++) {
list.add(i);
}

list.stream().unordered().limit(50_000_000).skip(25_000_000).findFirst().ifPresent(System.out::println); // 25000000 always

对于连续流,相遇顺序的存在或不存在不会影响性能,只有确定性

但无论我运行多少次这个代码,我总是得到相同的结果,这与上面的说法不一致。为什么?

Unordered只是简单地说"不用麻烦点这个流"它可以防止不必要的最终排序操作,从而可能产生额外的开销并影响性能。如何使用这种方法的一个例子是在并行操作中连接有序流的不同部分。对于有序流,必须等待某些线程完成处理以保持顺序可能需要比每个线程的输出在完成时使用更长的时间。

但正如评论中所说/暗示的那样,除非专门针对(例如排序(,否则任何操作都不会特意更改流的顺序。排序操作的输出将标记为有序,因为需要保留顺序。

流最初是按遇到的值放置在流上的顺序排列的。

int ch = IntStream.range(0,2).unordered().spliterator().characteristics();
System.out.println(ch&Spliterator.ORDERED);

打印0,因此有序位未设置

集合是无序的数据结构,因此排序会强制它们进行排序。

int ch =Set.of(1,2,3,4,5).stream().sorted().spliterator().characteristics();
System.out.println(ch&Spliterator.ORDERED);

打印CCD_ 2,从而设置有序位(位4(。

相关内容

最新更新