Caution
스트림 연산을 수행하는 동안에는 해당 스트림을 뒷받침하는 컬렉션을 절대 수정하면 안 된다(스레드에 안전한 수정인 경우에도). 스트림은 자체적으로 데이터를 모으지 않음을 명심하기 바란다(데이터는 항상 별도의 컬렉션에 존재한다). 만일 해당 컬렉션을 수정하면 스트림 연산들의 결과는 정의되지 않는다. JDK 문서에서는 이 요구 사항을 방해 금지 noninterference라고 언급하고 있다. 이 사항은 순차 스트림과 병렬 스트림 모두에 적용된다.
엄밀히 말하면 중간 스트림 연산은 지연 처리되기 때문에 최종 연산이 실행하는 시점 이전까지는 컬렉션을 변경할 수 있다. 예를 들어, 다음은 올바른 코드다.
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));
// 오류 — 방해