每个有状态的中间Stream API操作都保证生成一个新的源集合吗?

16 浏览
0 Comments

每个有状态的中间Stream API操作都保证生成一个新的源集合吗?

下面的陈述是真的吗?

“sorted()”操作是一个“有状态的中间操作”,这意味着后续操作不再对原始集合进行操作,而是对内部状态进行操作。

(来源和来源 - 它们似乎是互相复制或来自同一来源。)

免责声明:我知道以下片段不是 Java Stream API 的合法用法。不要在生产代码中使用。

我从上述来源中测试了 Stream::sorted 作为一个片段:

final List list = 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 List list = IntStream.range(0, 10).boxed().collect(Collectors.toList());
list.stream()
    .filter(i -> i > 5)
    .distinct()
    .forEach(list::remove);          // 抛出 NullPointerException

令我惊讶的是,抛出了 NullPointerException。

所有测试过的方法都符合“有状态的中间操作”的特征。然而,Stream::sorted 的这种独特行为既没有记录,也没有在“Stream 操作和流水线”部分解释有状态的中间操作是否真正保证了一个新的源集合。

我的困惑来自哪里,对上述行为的解释是什么?

0