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로 구현해보는 예제이다.
▼ 위 코드를 변환하면
'자바 > 스트림' 카테고리의 다른 글
collect() 메서드(3) - groupingBy() (0) | 2022.04.20 |
---|---|
collect() 메서드(2) - partitioningBy() (0) | 2022.04.20 |
collect() 메서드(1) (0) | 2022.04.19 |
스트림의 최종 연산(조건 검사, 통계, 리듀싱) (0) | 2022.04.15 |
Optional<T>와 OptionalInt (0) | 2022.04.15 |