2014-07-19 268 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如果條件成立,則在流中提示。