每个有状态的中间Stream API操作都保证生成一个新的源集合吗?
每个有状态的中间Stream API操作都保证生成一个新的源集合吗?
下面的陈述是真的吗?
“sorted()”操作是一个“有状态的中间操作”,这意味着后续操作不再对原始集合进行操作,而是对内部状态进行操作。
(来源和来源 - 它们似乎是互相复制或来自同一来源。)
免责声明:我知道以下片段不是 Java Stream API 的合法用法。不要在生产代码中使用。
我从上述来源中测试了 Stream::sorted 作为一个片段:
final Listlist = IntStream.range(0, 10).boxed().collect(Collectors.toList()); list.stream() .filter(i -> i > 5) .sorted() .forEach(list::remove); System.out.println(list); // 输出 [0, 1, 2, 3, 4, 5]
它有效。我用 Stream::distinct、Stream::limit 和 Stream::skip 替换了 Stream::sorted:
final Listlist = IntStream.range(0, 10).boxed().collect(Collectors.toList()); list.stream() .filter(i -> i > 5) .distinct() .forEach(list::remove); // 抛出 NullPointerException
令我惊讶的是,抛出了 NullPointerException。
所有测试过的方法都符合“有状态的中间操作”的特征。然而,Stream::sorted 的这种独特行为既没有记录,也没有在“Stream 操作和流水线”部分解释有状态的中间操作是否真正保证了一个新的源集合。
我的困惑来自哪里,对上述行为的解释是什么?