모던 자바 인 액션 6장 : 스트림으로 데이터 수집

Adam·2024년 6월 26일
0

모던 자바 인 액션

목록 보기
6/20

컬랙터란 무엇인가?

고급 리듀싱 기능을 수행하는 컬랙터

collect를 호출하면 리듀싱 연산을 이용해서 스트림의 각 요소를 방문하면서 컬랙터가 작업을 처리

위 그림처럼 Collector 인터페이스의 메서드를 어떻게 구현하느냐에 따라 어떤 리듀싱 연산이 수행될지 결정

미리 정의된 컬랙터

Collectors에서 제공하는 메서드의 기능

  1. 스트림 요소를 하나의 값으로 리듀스하고 요약
  2. 요소 그룹화
  3. 요소 분할

리듀싱과 요약

컬랙터로 스트림의 모든 항목을 하나의 결과로 합칠 수 있다

스트림에서 최댓값과 최솟값 검색

최댓값: Collectors.maxBy

최솟값: Collectors.minBy

Comparator<Dish> calorieComparator = Comparator.comparingInt(Dish::getCalories);
Optional<Dish> biggestCalorieDish = menu.stream().collect(maxBy(calorieComparator));

요약 연산

스트림에 있는 객체의 숫자 필드의 합계나 평균 등을 반환하는 리듀싱 연산

최대, 최소, 합계, 평균에도 요약 연산을 사용 가능하여 원하는 데이터 타입으로 반환 가능

문자열 연결

joining: StringBuilder을 이용해 문자열을 하나로 만든다

그룹화

데이터 집합을 하나 이상의 특성으로 분류하는 작업

groupingBy 함수로 스트림의 특정 값으로 그룹화 하는 것이 가능

분할

불리언을 반환하기 떄문에 맵의 키 형식은 Boolean

장점: 참, 거짓 두 가지 요소의 스트림 리스트를 모두 유지

Collector 인터페이스

리듀싱 연산을 어떻게 구현할지 제공하는 메서드 집합으로 구성

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: 수집 연산 결과 객체의 형식

  1. supplier: 새로운 결과 컨테이너 생성
  2. accumulator: 결과 컨테이너에 요소 추가
  3. finisher: 최종 변환값을 결과 컨테이너로 적용
  4. combiner: 두 결과 컨테이너 병합
  5. characteristics: 다음 3가지 항목을 포함하는 열거형
    1. Unordered: 리듀싱 결과는 스트림 요소의 방문 순서나 누적 순서에 영향을 받지 않는다
    2. Concurrent: 다중 스레드에서 acuumulator 함수를 동시에 호출할 수 있으며 병렬 리듀싱 수행 가능
    3. Identity-Finish: 리듀싱 과정의 최종 결과로 누적자 객체를 바로 사용 가능

해당 메서드를 오버라이드 해서 커스텀 Collector을 구현하는 것이 가능하다

profile
Keep going하는 개발자

0개의 댓글