자바/스트림

Collector

백_곰 2022. 4. 21. 16:28

1. Collector 구현하기

- Collector를 구현한다는 것은 Collector 인터페이스의 메서드를 가지고 구현한다는 것인데,

Collector 인터페이스는 아래와 같이 생겼다.

 

Public interface Collector<T, A, R>{

    Supplier<A>                supplier();

    // 작업 결과를 저장할 공간을 제공

 

    BiConsumer<A, T>        accumulator();

    // 스트림의 요소를 수집할 방법을 제공

 

    BinaryOperator<A>       combiner();

    // 두 저장공간을 병합할 방법을 제공(병렬 스트림)

 

    Function<A, R>            finisher();

    // 결과를 최종적으로 변환할 방법을 제공

 

    Set<Characteristics> characteristics();

    // Collector의 특성이 담긴 Set을 반환한다.

     ....

}

 

( 직접 구현해야 하는 것은 위 5개 메서드인데, characteristics()를 제외하면 모두 반환타입이

함수형 인터페이스이다. )

( 즉, 4개의 람다식을 사용하면 된다. )

 

( Characteristics()는 컬렉터가 수행하는 작업의 속성에 대한 정보를 제공하기 위한 것이다. )

( 그러므로, 아래의 속성 중에서 해당하는 것을 다음과 같이 Set에 담아 반환한다. )

 

(1) Characteristics.CONCURRENT

: 병렬로 처리할 수 있는 작업

 

(2) Characteristics.UNORDERED

: 스트림의 요소의 순서가 유지될 필요가 없는 작업

 

(3) Characteristics.IDENTITY_FINISH

: finisher()가 항등 함수인 작업

 

 

( 보통 정의하면 아래 코드처럼 수행하게 된다. )

 

Set<Characteristics> characteristics() {

       return Collections.unmodifiableSet(EnumSet.of(

                                Collector.Characteristics.CONCURRENT

                                Collector.Characteristics.UNORDERED

                ));

}

 

 

( 만약 비어있다고 하면, 아래 코드처럼 수행하면 된다. )

 

 

 

 

2. Collector를 이해하기 위한 예제(1)

: 아래의 코드를 Collector로 구현해보는 예제이다.

        ▼ 위 코드를 변환하면