在使用Stream"filter"和"collect"之后,Java 8会创建一个新的List吗?

cod*_*erz 13 java list java-8 java-stream

我有使用Java8的代码:

List<Integer> list = new ArrayList<Integer>();
list.add(3);
list.add(5);
list.add(4);
list.add(2);
list.add(5);
list = list.stream().filter(i -> i >= 3).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

原始列表是[3,5,4,2,5].在"过滤"和"收集"操作之后,列表变为[3,5,4,5].

是否所有操作都在原始列表中执行,并且不创建新列表?或者在"过滤"和"收集"操作之后,返回一个新创建的列表并忽略原始列表?

Mur*_*nik 21

collectwith 的调用Collectors.toList()将创建一个新列表.原始列表不受流式传输的影响.


Tag*_*eev 21

如果您确实想要修改原始列表,请考虑使用removeIf:

list.removeIf(i -> i < 2);
Run Code Online (Sandbox Code Playgroud)


Chr*_*ris 5

流操作要么是中间操作,要么是最终操作。 中间操作返回一个流,以便您可以链接多个中间操作。 终端操作返回 void 或其他内容。

大多数流操作都是非干扰的,这意味着它们不会修改流的数据源。但是通过调用该collect方法,您将创建一个新列表并将其分配给list

  • 所有流操作都是互不干扰的(它们都不会修改数据源),只要您提供给它们的参数也是互不干扰的。 (2认同)