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가 올바르지 않으면 병렬 스트림에서 결과가 틀립니다. 순차 스트림에서 동작해도 병렬에서 실패할 수 있으니 반드시 검증하세요.
Continue Learning
Java 학습을 이어가세요
총 200개의 독립 HTML 학습 문서 중 하나입니다. 각 문서는 고유 URL과 canonical 메타데이터를 가집니다.