2014-07-19 162 views
4

我明白为什么下面的代码是可以的。因为集合在调用终端操作之前正在修改。java 8流干扰与非干扰

List<String> wordList = ...; 
Stream<String> words = wordList.stream(); 
wordList.add("END"); // Ok 
long n = words.distinct().count(); 

但为什么这段代码不好?

Stream<String> words = wordList.stream(); 
words.forEach(s -> if (s.length() < 12) wordList.remove(s)); // Error—interference 

回答

5

Stream.forEach()是终端操作,和底层单词表集合被修改的终端已经开始之后/调用。

+0

Thx。我不知道这是一个终端操作。 –

4

Joachim's answer是正确的,+1。

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

如果你想变异就地列表,你可以用一个新的默认方法,这样做的List而是采用流:

wordList.removeIf(s -> s.length() < 12); 

如果你想保留原始列表不变,但创建修改后的副本,你可以使用流和收藏家要做到这一点:

​​

注意,我必须反转条件的意义,因为filter需要一个谓词保持 VA如果条件成立,则在流中提示。