以下陈述是否正确?
The sorted()
操作是“有状态中间操作”,这意味着后续操作不再对后备集合进行操作,而是对内部状态进行操作。
(Source https://www.toptal.com/java/top-10-most-common-java-development-mistakes and source https://dzone.com/articles/java-8-friday-10-subtle - they seem to copy from each other or come from the same source.)
免责声明:我知道以下代码片段不是 Java Stream API 的合法用法。不要在生产代码中使用。
我测试过Stream::sorted https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#sorted--作为上述来源的片段:
final List<Integer> list = IntStream.range(0, 10).boxed().collect(Collectors.toList());
list.stream()
.filter(i -> i > 5)
.sorted()
.forEach(list::remove);
System.out.println(list); // Prints [0, 1, 2, 3, 4, 5]
有用。我更换了Stream::sorted https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#sorted-- with Stream::distinct https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#distinct--, Stream::limit https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#limit-long- and Stream::skip https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#skip-long-:
final List<Integer> list = IntStream.range(0, 10).boxed().collect(Collectors.toList());
list.stream()
.filter(i -> i > 5)
.distinct()
.forEach(list::remove); // Throws NullPointerException
令我惊讶的是,NullPointerException
被抛出。
所有测试方法均遵循有状态中间操作 https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html#StreamOps特征。然而,这种独特的行为Stream::sorted https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#sorted--没有记录也没有流操作和管道 https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html#StreamOps部分解释了是否有状态中间操作真正保证新源合集。
我的困惑从何而来?上述行为的解释是什么?