每个有状态中间流 API 操作是否保证新的源集合?
以下陈述是否属实?
该操作是“有状态中间操作”,这意味着后续操作不再对支持集合进行操作,而是对内部状态进行操作。
sorted()
免責聲明:我知道以下片段不是Java Stream API的合法用法。不要在生产代码中使用。
我已经测试了 Stream::排序
为来自上述来源的片段:
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
替换为 Stream::d istinct
、Stream::limit
和 Stream::skip
:
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
所有测试方法都遵循有状态中间操作特性。然而,Stream::sorted
的这种独特行为没有记录,流操作和管道部分也没有解释有状态中间操作是否真的保证了新的源集合。
我的困惑从何而来,对上述行为的解释是什么?