woowacourse-study / 2022-modern-java-in-action

우아한테크코스 4기 모던 자바 인 액션 스터디
10 stars 4 forks source link

쇼트서킷은 어떻게 작동하는 것일까? #39

Open sure-why-not opened 2 years ago

sure-why-not commented 2 years ago

문제

전체 스트림을 처리하지 않아도 결과를 반환할 수 있는 서킷 방식은 실제로 어떻게 작동하는 것일까?

선정 배경

스트림의 결과에만 집중했지, 내부적으로 어떻게 작동되고 있는지에 대해 집중해보진 못했었다. 책에서 간략하게 쇼트서킷을 언급했는데, 이 부분에 대해 찾아보고 실습해본 내용을 공유해보면 좋을 것 같다는 생각이 들어서 선정했다.

관련 챕터

sure-why-not commented 2 years ago

쇼트서킷이란?

if ( 조건문1 && 조건문2 || 조건문3 ) {} 

조건문1이 거짓일 경우 다음 결과는 확인해볼 필요 없이 전체 if 문은 결과가 거짓이 된다.

스트림에서도 전체 스트림을 처리하지 않았더라도 결과를 반환할 수 있다.

findFirst, findAny, limit, allMatch, noneMatch 등의 연산은 모든 스트림을 처리하지 않고 결과를 반환할 수 있다.

sure-why-not commented 2 years ago

예시 1. limit

    @Test
    void 스트림_limit2() {
        List<String> strings = List.of("a", "lala", "yaho", "greenlone", "jung", "tiki", "sun", "alpa", "Torr");
        List<String> results = strings.stream()
            .filter(word -> {
                System.out.println("Call filter method: " + word);
                return word.length() > 1;
            })
            .map(word -> {
                System.out.println("Call map method: " + word);
                return word.substring(0, 3);
            })
            .limit(2)
            .collect(Collectors.toList());

        System.out.println();
        System.out.println("결과 : " + results);
    }

결과

Call filter method: a
Call filter method: lala
Call map method: lala
Call filter method: yaho
Call map method: yaho

결과 : [lal, yah]

예시 2. 스트림 - findFirst()

    @Test
    void 스트림_findFirst() {
        List<String> strings = List.of("lala", "yaho", "greenlone", "jung", "tiki", "sun", "alpa", "Torr");
        String result = strings.stream()
            .filter(word -> {
                System.out.println("Call filter method: " + word);
                return word.length() > 3;
            })
            .map(word -> {
                System.out.println("Call map method: " + word);
                return word.substring(0, 3);
            })
            .findFirst()
            .orElseThrow(() -> new IllegalArgumentException(""));

        System.out.println();
        System.out.println("결과 : " + result);
    }

결과

Call filter method: a
Call filter method: lala
Call map method: lala

결과 : lal

예시 3. 병렬 스트림 - findFirst()

    @Test
    void 병렬스트림_findFirst() {
        List<String> strings = List.of("a", "lala", "yaho", "greenlone", "jung", "tiki", "sun", "alpa", "Torr");
        String result = strings.parallelStream()
            .filter(word -> {
                System.out.println("Call filter method: " + word);
                return word.length() > 3;
            })
            .map(word -> {
                System.out.println("Call map method: " + word);
                return word.substring(0, 3);
            })
            .findFirst()
            .orElseThrow(() -> new IllegalArgumentException(""));
        System.out.println();
        System.out.println("결과 : " + result);
    }

결과

Call filter method: jung
Call filter method: a
Call filter method: tiki
Call filter method: alpa
Call filter method: sun
Call filter method: lala
Call filter method: yaho
Call filter method: greenlone
Call filter method: Torr
Call map method: greenlone
Call map method: alpa
Call map method: tiki
Call map method: yaho
Call map method: lala
Call map method: jung
Call map method: Torr

결과 : lal

예시 4. 스트림 - findAny()

    @Test
    void 스트림_findAny() {
        List<String> strings = List.of("a", "lala", "yaho", "greenlone", "jung", "tiki", "sun", "alpa", "Torr");
        String result = strings.stream()
            .filter(word -> {
                System.out.println("Call filter method: " + word);
                return word.length() > 3;
            })
            .map(word -> {
                System.out.println("Call map method: " + word);
                return word.substring(0, 3);
            })
            .findAny()
            .orElseThrow(() -> new IllegalArgumentException(""));

        System.out.println();
        System.out.println("결과 : " + result);
    }

결과

Call filter method: a
Call filter method: lala
Call map method: lala

결과 : lal

예시 5. 병렬 스트림 - findAny()

    void 병렬스트림_findAny() {
        List<String> strings = List.of("a", "lala", "yaho", "greenlone", "jung", "tiki", "sun", "alpa", "Torr");
        String result = strings.parallelStream()
            .filter(word -> {
                System.out.println("Call filter method: " + word);
                return word.length() > 3;
            })
            .map(word -> {
                System.out.println("Call map method: " + word);
                return word.substring(0, 3);
            })
            .findAny()
            .orElseThrow(() -> new IllegalArgumentException(""));

        System.out.println();
        System.out.println("결과 : " + result);
    }

결과

Call filter method: yaho
Call filter method: sun
Call filter method: alpa
Call filter method: Torr
Call filter method: a
Call filter method: jung
Call filter method: tiki
Call map method: yaho
Call filter method: lala
Call map method: Torr
Call filter method: greenlone
Call map method: lala
Call map method: alpa
Call map method: tiki
Call map method: jung
Call map method: greenlone

결과 : yah