Collector

Collectors

Collector

스트림 데이터 수집 방법을 정의한 인터페이스

T: 스트림 요소 타입

A: 중간 결과를 저장할 누적자 타입

R: 최종 반환 타입

public interface Collector<T, A, R> {

    /*
        결과 컨테이너를 생성하는 메서드
        () -> new ArrayList<>()
     */
    Supplier<A> supplier();

    /*
        스트림 요소를 결과 컨테이너에 누적하는 메서드
        (list, item) -> list.add(item) 
     */
    BiConsumer<A, T> accumulator();

    /*
        병렬 스트림에서 부분 결과를 병합하는 메서드
        스트림에서 combiner 단어는 모두 병렬 스트림과 관련됨
        
        (list1, list2) -> list1.addAll(list2)  
     */
    BinaryOperator<A> combiner();

    /*
        누적 결과를 최종 결과로 반환하는 메서드
        list -> Collections.unmodifiableList(list)
     */
    Function<A, R> finisher();

    /*
        collector의 동작 특성을 정의
        Characteristics: CONCURRENT, UNORDERED, IDENTITY_FINISH
     */
    Set<Characteristics> characteristics();
}

Collectors

사전 정의 Collector 및 쉽게 생성하기 위한 정적 팩토리 메서드를 제공하는 유틸리티 클래스임

컬렉션 변환 정적 팩토리 메서드

<T> Collector<T, ?, List<T>> toList(): 스트림 요소를 List에 담아 반환

<T> Collector<T, ?, Set<T>> toSet(): 스트림 요소를 Set에 담아 반환

<T, C extends Collection<T>> Collector<T, ?, C> toCollection(Supplier<C> collectionFactory) : 스트림 요소를 특정 컬렉션에 담아 반환

맵 변환 정적 팩토리 메서드

<T, K, U> Collector<T, ?, Map<K, U>> toMap(Function<? super T, ? extends K> keyMapper, 
                                           Function<? super T, ? extends U> valueMapper)

스트림 요소를 주어진 keyMapper와 valueMapper 람다식을 통해 맵에 담아 반환함

제네릭 타입

keyMapper: 스트림 요소가 주어지면 맵의 키로 반환함

valueMapper: 스트림 요소가 주어지면 맵의 값으로 반환함