WeeklyStudy / modern-java-in-action

Modern Java in Action Study
0 stars 0 forks source link

distinct 와 sorted 의 무한 스트림 생성 예제 실행 결과에 대한 의문점 #13

Open ahah525 opened 1 year ago

ahah525 commented 1 year ago

문제

https://github.com/WeeklyStudy/modern-java-in-action/issues/12 이슈에서 무한 스트림 생성에 관한 예제를 테스트해보던 중 생긴 의문점입니다.

distinctsortedstateful 연산으로 지연 연산을 무효화시킨다. 결과를 생성하기 전에 전체 데이터를 탐색하는 결과를 초래한다. 그런데, 둘의 내부동작 방식이 약간 차이가 있는 것인지 같은 람다식(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");
}

관련 목차