Open sure-why-not opened 2 years ago
쇼트서킷이란?
if ( 조건문1 && 조건문2 || 조건문3 ) {}
조건문1이 거짓일 경우 다음 결과는 확인해볼 필요 없이 전체 if 문은 결과가 거짓이 된다.
스트림에서도 전체 스트림을 처리하지 않았더라도 결과를 반환할 수 있다.
findFirst
, findAny
, limit
, allMatch
, noneMatch
등의 연산은 모든 스트림을 처리하지 않고 결과를 반환할 수 있다.
예시 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
문제
전체 스트림을 처리하지 않아도 결과를 반환할 수 있는 서킷 방식은 실제로 어떻게 작동하는 것일까?
선정 배경
스트림의 결과에만 집중했지, 내부적으로 어떻게 작동되고 있는지에 대해 집중해보진 못했었다. 책에서 간략하게 쇼트서킷을 언급했는데, 이 부분에 대해 찾아보고 실습해본 내용을 공유해보면 좋을 것 같다는 생각이 들어서 선정했다.
관련 챕터