자바 - Teeing Collectors
안녕하세요, 미래의 자바 마법사 여러분! ? 오늘은 자바의 Teeing Collectors의 세계로 흥미진진한 여정을 떠나보겠습니다. 프로그래밍에 새로운 사람이라도 걱정 마세요 – 여러분의 친절한 가이드로서 저가 있으니 단계별로 진행하겠습니다. 이 튜토리얼이 끝날 때까지 여러분은 자바로 무엇을 할 수 있는지 놀라할 것입니다!
Teeing Collectors는 무엇인가요?
깊은 물속으로 뛰어들기 전에 기본적인 것부터 시작해보겠습니다. 먹고 싶은 음식점에 가서 서빙원이 두 개의 nossle을 가진 녹차 주전자를 가져다주는 것을 상상해보세요. 자바에서 Teeing Collector는 이런 것과 비슷합니다 – 데이터를 동시에 두 개의 다른 "컵" (또는 연산)에 따르는 방법입니다!
자바에서는 Teeing Collector가 같은 입력에 두 개의 독립적인 collector를 적용하고 그 결과를 결합할 수 있게 합니다. 마치 두 개의 도우미가 같은 작업을 하지만 다른 측면에 집중하고, 마지막에 그 작업을 결합하는 것과 같습니다.
Collectors.teeing() 메서드
자바 12에서 Collectors.teeing()
메서드가 도입되었습니다. 이는 데이터 컬렉션을 처리하는 데 강력한 도구인 Stream API의 일부입니다. 그 문법을 살펴보겠습니다:
문법
public static <T,R1,R2,R> Collector<T,?,R> teeing(
Collector<? super T,?,R1> downstream1,
Collector<? super T,?,R2> downstream2,
BiFunction<? super R1,? super R2,R> merger)
이렇게 두려운 보이는 문법에 두려워 마세요! 그것을 분석해보겠습니다:
-
T
: 입력 요소의 형 -
R1
: 첫 번째 collector의 결과 형 -
R2
: 두 번째 collector의 결과 형 -
R
: 최종 결과 형
이 메서드는 세 가지 매개변수를 취합니다:
-
downstream1
: 첫 번째 collector -
downstream2
: 두 번째 collector -
merger
: 두 collector의 결과를 결합하는 함수
이제 몇 가지 예제를 통해 실제로 보여드리겠습니다!
예제 1: 평균과 수량 계산
여러분이 교사라고 상상해보겠습니다 (저와 마찬가지로!) 학생들의 평균 점수와 학생 수를 동시에 계산하고 싶다면 어떻게 해야 할까요? Teeing Collector를 사용하여 이를 구현할 수 있습니다:
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class StudentScoreAnalyzer {
public static void main(String[] args) {
List<Integer> scores = Arrays.asList(85, 90, 78, 92, 88);
var result = scores.stream().collect(
Collectors.teeing(
Collectors.averagingInt(Integer::intValue),
Collectors.counting(),
(average, count) -> String.format("평균: %.2f, 수량: %d", average, count)
)
);
System.out.println(result);
}
}
이를 분석해보겠습니다:
- 학생 점수의 목록을 시작합니다.
-
scores.stream()
을 사용하여 이 점수의 스트림을 생성합니다. - 두 개의 collector를 사용하여
Collectors.teeing()
를 적용합니다:
-
Collectors.averagingInt(Integer::intValue)
는 평균 점수를 계산합니다. -
Collectors.counting()
는 점수의 수를 계산합니다.
- 결합 함수는 이 결과를 형식화된 문자열로 결합합니다.
이를 실행하면 다음과 같은 출력이 나옵니다:
평균: 86.60, 수량: 5
멋지지 않나요? 몇 줄의 코드만으로 우리는 데이터에서 두 가지 다른 메트릭을 계산했습니다!
예제 2: 가장 낮은 점수와 가장 높은 점수 찾기
이제 여러분의 반에서 가장 낮은 점수와 가장 높은 점수를 동시에 찾고 싶다고 가정해보겠습니다. 단일 스트림 연산으로 Teeing Collector를 사용하여 이를 구현할 수 있습니다:
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class StudentScoreAnalyzer {
public static void main(String[] args) {
List<Integer> scores = Arrays.asList(85, 90, 78, 92, 88);
var result = scores.stream().collect(
Collectors.teeing(
Collectors.minBy(Integer::compareTo),
Collectors.maxBy(Integer::compareTo),
(min, max) -> String.format("최저: %d, 최고: %d", min.orElse(0), max.orElse(0))
)
);
System.out.println(result);
}
}
이 예제에서:
- 같은 점수 목록을 사용합니다.
- 첫 번째 collector,
Collectors.minBy(Integer::compareTo)
,는 최소 점수를 찾습니다. - 두 번째 collector,
Collectors.maxBy(Integer::compareTo)
,는 최대 점수를 찾습니다. - 결합 함수는 이를 형식화된 문자열로 결합하며, 목록이 비어 있을 수 있으므로
orElse(0)
를 사용합니다.
이를 실행하면 다음과 같은 출력이 나옵니다:
최저: 78, 최고: 92
Teeing Collectors를 사용하는 이유
"이렇게 귀찮은 일을 하고 싶지 않아? 이 작업들을 별도로 할 수 없을까?"라고 생각할 수 있습니다. 물론 그럴 수 있습니다! 하지만 Teeing Collectors는 몇 가지 장점을 제공합니다:
- 효율성: 대형 데이터셋의 경우 한 번의 데이터 반복만으로 큰 성능 향상을 제공합니다.
- 가독성: 코드를 더 간결하고 한눈에 이해할 수 있게 만듭니다.
- 靈活性: 두 collector를 창의적으로 결합하여 복잡한 문제를 해결할 수 있습니다.
실제 응용
Teeing Collectors는 이러한 간단한 예제뿐만 아니라 실제 세상에서 매우 유용할 수 있습니다:
- 재무 응용 프로그램에서는 트랜잭션의 총액과 평균을 한 번에 계산할 수 있습니다.
- 데이터 분석에서는 데이터셋의 중앙값과 모드를 동시에 찾을 수 있습니다.
- 게임 개발에서는 가장 높은 점수와 그 점수를 달성한 플레이어 수를 추적할 수 있습니다.
결론
그렇게 여러분! 자바의 Teeing Collectors에 대해 깊이 있게 배웠습니다. 두 개의 연산을 동시에 수행하고 결과를 결합하는 단일 효율적인 스트림 연산을 통해 어떻게 작동하는지 봤습니다.
기억하자, 프로그래밍은 문제 해결에 관한 것이며, Teeing Collectors는 여러분의 문제 해결 도구集中的 또 다른 도구입니다. 더 많이 연습하면 자신의 프로젝트에서 더 창의적인 방법으로 사용할 수 있을 것입니다.
코딩을 계속하고, 계속 배우며, 가장 중요한 것은 즐기세요! 언제か 그날이 오겠죠? 여러분도 자바를 가르치며, 자신의 경험과 나쁜 개그를 새로운 세대의 프로그래머들과 공유할 수 있을 것입니다. 다음 번에 다시 뵙겠습니다, 즐거운 코딩! ?????
Credits: Image by storyset