distinct 와 sorted 는 stateful 연산으로 지연 연산을 무효화시킨다. 결과를 생성하기 전에 전체 데이터를 탐색하는 결과를 초래한다.
그런데, 둘의 내부동작 방식이 약간 차이가 있는 것인지 같은 람다식(n->n+1)으로 무한 스트림을 생성을 했음에도 불구하고 아래 예제 2, 3번과 같이 결과가 달랐다.
distinct 예제에서는 무한 스트림이 생성이 안되고 정상 종료 됐지만 sorted 예제에서는 예외가 터져서 실행이 안되는 문제가 발생했다.
또한, 같은 distinct 연산 이더라도 1번과 2번 예제에서 람다식이 차이로 인해 무한 스트림이 생성되기도 하고 생성되지 않기도 하는 경우를 확인할 수 있었다.
1. 무한 스트림 생성 문제 발생 : iterate(0, n -> (n + 1) % 2) ➜ distinct() ➜ limit()
public static void t1() {
IntStream.iterate(0, n -> (n + 1) % 2)
.distinct()
.limit(5)
.forEach(System.out::println);
System.out.println("complete");
}
2. 무한 스트림 생성 안됨 : iterate(0, n -> n + 1) ➜ distinct() ➜ limit()
public static void t1() {
IntStream.iterate(0, n -> (n + 1))
.distinct()
.limit(5)
.forEach(System.out::println);
System.out.println("complete");
}
3. 무한 스트림 생성 OutOfMemoryError 예외 발생 : iterate(0, n -> n + 1) ➜ sorted() ➜ limit()
public static void t3() {
Stream.iterate(0, n -> n + 1)
.sorted()
.limit(5)
.forEach(System.out::println);
System.out.println("complete");
}
문제
https://github.com/WeeklyStudy/modern-java-in-action/issues/12 이슈에서 무한 스트림 생성에 관한 예제를 테스트해보던 중 생긴 의문점입니다.
distinct
와sorted
는stateful 연산
으로 지연 연산을 무효화시킨다. 결과를 생성하기 전에 전체 데이터를 탐색하는 결과를 초래한다. 그런데, 둘의 내부동작 방식이 약간 차이가 있는 것인지 같은람다식(n->n+1)
으로 무한 스트림을 생성을 했음에도 불구하고 아래 예제 2, 3번과 같이 결과가 달랐다.distinct
예제에서는 무한 스트림이 생성이 안되고 정상 종료 됐지만sorted
예제에서는 예외가 터져서 실행이 안되는 문제가 발생했다.또한, 같은
distinct
연산 이더라도 1번과 2번 예제에서 람다식이 차이로 인해 무한 스트림이 생성되기도 하고 생성되지 않기도 하는 경우를 확인할 수 있었다.1. 무한 스트림 생성 문제 발생 :
iterate(0, n -> (n + 1) % 2) ➜ distinct() ➜ limit()
2. 무한 스트림 생성 안됨 :
iterate(0, n -> n + 1) ➜ distinct() ➜ limit()
3. 무한 스트림 생성 OutOfMemoryError 예외 발생 :
iterate(0, n -> n + 1) ➜ sorted() ➜ limit()
관련 목차
[4장] 스트림 소개
https://github.com/WeeklyStudy/modern-java-in-action/issues/12
참고자료
[Java8] Stream API
[Java] 스트림: 지연 연산과 최적화*
[Effective Java] 아이템 45 : 스트림은 주의해서 사용하라*
Why can do distinct() method at infinite stream in java
Do sorted and distinct immediately process the stream?