PHpullh
학습 라이브러리/Java/커스텀 Collector 만들기

JAVA · 컬렉션

커스텀 Collector 만들기

Collector 인터페이스를 직접 구현하여 맞춤 수집 전략을 만듭니다.

컬렉션고급Collector커스텀Collector.of병렬

핵심 설명

Collector 인터페이스를 직접 구현하여 맞춤 수집 전략을 만듭니다.

Java code

import java.util.*;
import java.util.stream.*;

public class CustomCollector {
    // 문자열을 역순으로 연결하는 Collector
    static Collector<String, ?, String> reverseJoining(String delimiter) {
        return Collector.of(
            // supplier: 컨테이너 생성
            () -> new ArrayDeque<String>(),
            // accumulator: 원소 추가
            (deque, item) -> deque.addFirst(item),
            // combiner: 병렬 시 결합
            (left, right) -> { right.addAll(left); return right; },
            // finisher: 최종 변환
            deque -> String.join(delimiter, deque),
            // characteristics
            Collector.Characteristics.IDENTITY_FINISH
        );
    }

    // Top N 수집기
    static <T extends Comparable<T>> Collector<T, ?, List<T>> topN(int n) {
        return Collector.of(
            () -> new PriorityQueue<T>(n),
            (pq, item) -> {
                pq.add(item);
                if (pq.size() > n) pq.poll();
            },
            (left, right) -> {
                left.addAll(right);
                while (left.size() > n) left.poll();
                return left;
            },
            pq -> {
                List<T> result = new ArrayList<>(pq);
                Collections.sort(result, Comparator.reverseOrder());
                return result;
            }
        );
    }

    public static void main(String[] args) {
        String result = List.of("A", "B", "C").stream()
            .collect(reverseJoining(" -> "));
        System.out.println(result); // C -> B -> A

        List<Integer> top3 = java.util.stream.IntStream.range(1, 100)
            .boxed().collect(topN(3));
        System.out.println(top3); // [99, 98, 97]
    }
}

학습 팁

Collector.of()의 5개 인자(supplier, accumulator, combiner, finisher, characteristics)를 이해하면 어떤 수집 로직이든 구현할 수 있습니다.

주의할 점

combiner가 올바르지 않으면 병렬 스트림에서 결과가 틀립니다. 순차 스트림에서 동작해도 병렬에서 실패할 수 있으니 반드시 검증하세요.

자주 묻는 질문

커스텀 Collector 만들기란 무엇인가요?

Collector 인터페이스를 직접 구현하여 맞춤 수집 전략을 만듭니다.

커스텀 Collector 만들기 학습 시 주의할 점은 무엇인가요?

combiner가 올바르지 않으면 병렬 스트림에서 결과가 틀립니다. 순차 스트림에서 동작해도 병렬에서 실패할 수 있으니 반드시 검증하세요.