JAVA/포스팅

자바 Collector구현하기

짜집퍼박사(짜박) 2023. 11. 25. 20:32

Java에서 Collector를 직접 구현하는 것은 강력한 커스터마이징 기능을 제공하며, 특정한 요구사항에 따라 스트림의 요소를 수집할 수 있습니다. Collector는 다음의 세 가지 메서드를 가지고 있습니다.

 

1. Supplier<A> supplier()

새로운 누적기(accumulator) 인스턴스를 생성하는 함수를 반환합니다.

2. BiConsumer<A, T> accumulator()

누적기에 요소를 추가하는 함수를 반환합니다.

3. BinaryOperator<A> combiner()

두 누적기를 결합하는 함수를 반환합니다. 병렬 스트림에서 사용됩니다.

4. Function<A, R> finisher()

최종 결과를 만들어내는 함수를 반환합니다.

5. Set<Characteristics> characteristics()

컬렉터의 특성을 나타내는 불변 집합을 반환합니다.

 

커스텀 Collector를 구현하려면 Collector 인터페이스의 이 메서드들을 구현해야 합니다.

다음은 간단한 예제로, 스트림에서 문자열의 길이가 특정 길이보다 긴 문자열만 필터링하여 수집하는 Collector를 만들어보겠습니다. 이를 위해 Collector 인터페이스를 구현하는 클래스를 만들겠습니다.

import java.util.*;
import java.util.function.*;
import java.util.stream.Collector;
import java.util.stream.Collector.Characteristics;

public class StringLengthCollector implements Collector<String, List<String>, List<String>> {

    @Override
    public Supplier<List<String>> supplier() {
        return ArrayList::new; // 새로운 누적기(accumulator) 생성
    }

    @Override
    public BiConsumer<List<String>, String> accumulator() {
        return List::add; // 누적기에 요소를 추가하는 함수
    }

    @Override
    public BinaryOperator<List<String>> combiner() {
        return (list1, list2) -> {
            list1.addAll(list2); // 두 누적기를 결합하는 함수 (병렬 처리 시 사용)
            return list1;
        };
    }

    @Override
    public Function<List<String>, List<String>> finisher() {
        return Function.identity(); // 최종 결과를 만들어내는 함수
    }

    @Override
    public Set<Characteristics> characteristics() {
        return Collections.emptySet(); // 컬렉터의 특성을 나타내는 불변 집합
    }

    public static void main(String[] args) {
        List<String> words = Arrays.asList("apple", "banana", "grape", "watermelon", "orange");

        List<String> result = words.stream()
                .filter(s -> s.length() > 6)
                .collect(new StringLengthCollector());

        System.out.println(result); // [watermelon]
    }
}

이 컬렉터는 간단한 문자열 길이 필터링을 수행하며, supplier()는 누적기를 초기화하는 함수, accumulator()는 누적기에 요소를 추가하는 함수, combiner()는 두 누적기를 결합하는 함수, finisher()는 최종 결과를 생성하는 함수를 제공합니다.

물론 이 예제는 간단한 경우이며, 실제로 사용되는 커스텀 컬렉터는 더 복잡할 수 있습니다. 하지만 이러한 기본적인 예제를 통해 Collector 인터페이스의 사용 방법을 이해할 수 있습니다.

 

With ChatGPT

'JAVA > 포스팅' 카테고리의 다른 글

자바 입출력  (0) 2023.11.25
자바 스트림의 변환  (0) 2023.11.25
자바 collect()  (0) 2023.11.25
자바 스트림의 최종연산  (0) 2023.11.25
자바 OptionalInt  (0) 2023.11.25