Java 8 java 8流干扰与非干扰

Java 8 java 8流干扰与非干扰,java-8,java-stream,Java 8,Java Stream,我理解为什么下面的代码是正确的。因为在调用终端操作之前正在修改集合 List<String> wordList = ...; Stream<String> words = wordList.stream(); wordList.add("END"); // Ok long n = words.distinct().count(); List wordList=。。。; Stream words=wordList.Stream(); wordList.add(“END”)

我理解为什么下面的代码是正确的。因为在调用终端操作之前正在修改集合

List<String> wordList = ...;
Stream<String> words = wordList.stream();
wordList.add("END"); // Ok
long n = words.distinct().count();
List wordList=。。。;
Stream words=wordList.Stream();
wordList.add(“END”);//好啊
long n=单词.distinct().count();
但是为什么这个代码不好呢

Stream<String> words = wordList.stream();
words.forEach(s -> if (s.length() < 12) wordList.remove(s)); // Error—interference
streamwords=wordList.Stream();
words.forEach->if(s.length()<12)wordList.remove(s));//误差干扰
是一种终端操作,在启动/调用终端后,将修改底层的单词列表集合。

正确,+1

您没有特别要求,但为了其他读者的利益,这里有一些技术可以用不同的方式重写程序,避免流干扰问题

如果您想就地修改列表,可以使用
list
上的新默认方法,而不是使用流:

wordList.removeIf(s -> s.length() < 12);
wordList.removeIf(s->s.length()<12);
如果要保留原始列表不变,但创建修改后的副本,可以使用流和收集器来执行此操作:

List<String> newList = wordList.stream()
    .filter(s -> s.length() >= 12)
    .collect(Collectors.toList());
List newList=wordList.stream()
.filter(s->s.length()>=12)
.collect(Collectors.toList());

请注意,我必须反转条件的含义,因为
filter
接受一个谓词,如果条件为真,该谓词将在流中保留值。

Thx。我不知道这是一个终点站。