더북(TheBook)

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));

// 오류 — 방해

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.