IntStream.range(0, 10_000)
.limit(5)
.... => 5번만 실행함
최종 연산자 수행되고 나면 스트림 파이프라인은 소비된 것으로 간주
사이드 이펙트를 통해서만 동작할 수 있는 연산들은 신중하게 사용해야 함
forEach : 로그나 디버깅을 위한 출력에만 사용하는 것을 권장
이펙티브 자바에서 forEach가 덜 스트림 스럽다 라고 이야기
public static List<String> discouragedVersion(Stream<String> stream, Pattern pattern) {
List<String> results = new ArrayList<>();
stream.filter(s -> pattern.matcher(s).matches())
// forEach 내부에서 값을 할당하며 사용할 경우 불필요한 sideEffect -> 외부 상태 변경(외부 선언 리스트)
.forEach(results::add);
return results;
}
public static List<String> discouragedVersionWithParallel(Stream<String> stream, Pattern pattern) {
List<String> results = new ArrayList<>();
stream.parallel()
.filter(s -> pattern.matcher(s).matches())
// 병렬처리 추가될 경우 올바른 결과값 기대 어렵
// 요소 추가하려는데 누군가는 접근하려고 할 경우 등
.forEach(results::add);
return results;
}
public static List<String> encouragedVersion(Stream<String> stream, Pattern pattern) {
return stream
.filter(s -> pattern.matcher(s).matches())
// sideEffect X
.collect(Collectors.toList());
}
.distinct() .limit(10) => distinct()로 중복값 제거하고 0과 1이 반복적으로 들어오면 limit(10)에 걸릴 일이 없음 => 무한 루프
--> ex) .limit(10) 한 뒤에 distinct() 해야 10번걸림