개발/JAVA

Stream은 종결 연산자 이후에 재 사용이 불가능 하다.

beng9re 2022. 11. 13. 16:33

Stream을 종결 연산자 이후에 재사용을 하면 IllegalStateException 발생 된다.

List<String> list = List.of("2", "4");  

Stream<String> stream = list.stream();  
stream.count();  

//종결 연산자 count 이전에 수행하여 예외가 발생된다.  
assertThatExceptionOfType(IllegalStateException.class).isThrownBy(() -> {  
    stream.collect(Collectors.joining());  
});

재활용을 위한 트릭

Supplier 클래스를 활용하여 새로운 스트림을 반환하여 처리한다.

List<String> list = List.of("2", "4");

//Supplier을 뽑고
Supplier<Stream<String>> streamSupplier = list::stream;

//get하여 새로운 스트림을 반환 시키면
assertThatNoException().isThrownBy(() -> {
    streamSupplier.get().collect(Collectors.joining());
    streamSupplier.get().count();
});

결론

Stream은 종결 연산자 이후에 재 사용이 불가능한 사실을 인지하여 조심히 사용하자