collect를 호출하면 리듀싱 연산을 이용해서 스트림의 각 요소를 방문하면서 컬랙터가 작업을 처리
위 그림처럼 Collector 인터페이스의 메서드를 어떻게 구현하느냐에 따라 어떤 리듀싱 연산이 수행될지 결정
Collectors에서 제공하는 메서드의 기능
컬랙터로 스트림의 모든 항목을 하나의 결과로 합칠 수 있다
최댓값: Collectors.maxBy
최솟값: Collectors.minBy
Comparator<Dish> calorieComparator = Comparator.comparingInt(Dish::getCalories);
Optional<Dish> biggestCalorieDish = menu.stream().collect(maxBy(calorieComparator));
스트림에 있는 객체의 숫자 필드의 합계나 평균 등을 반환하는 리듀싱 연산
최대, 최소, 합계, 평균에도 요약 연산을 사용 가능하여 원하는 데이터 타입으로 반환 가능
joining: StringBuilder을 이용해 문자열을 하나로 만든다
데이터 집합을 하나 이상의 특성으로 분류하는 작업
groupingBy 함수로 스트림의 특정 값으로 그룹화 하는 것이 가능
불리언을 반환하기 떄문에 맵의 키 형식은 Boolean
장점: 참, 거짓 두 가지 요소의 스트림 리스트를 모두 유지
리듀싱 연산을 어떻게 구현할지 제공하는 메서드 집합으로 구성
public interface Collector<T,A,R>{
Supplier<A> supplier();
BiConsumer<A,T> accumulator();
Function<A,R> finisher();
BinaryOperator<A> combiner();
Set<Characteristics> characteristics();
}
T: 수집될 스트림 항목의 제네릭 형식
A: 수집 과정에서 중간 결과를 누적하는 객체
R: 수집 연산 결과 객체의 형식
해당 메서드를 오버라이드 해서 커스텀 Collector을 구현하는 것이 가능하다