PHpullh

JAVA · 컬렉션

Spliterator

Spliterator의 분할-순회 원리와 커스텀 구현을 알아봅니다.

컬렉션고급Spliterator분할배치StreamSupport

핵심 설명

Spliterator의 분할-순회 원리와 커스텀 구현을 알아봅니다.

Java code

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

public class SpliteratorDemo {
    // 고정 크기 배치를 위한 커스텀 Spliterator
    static <T> Stream<List<T>> batch(Stream<T> stream, int batchSize) {
        Spliterator<T> src = stream.spliterator();

        return StreamSupport.stream(new Spliterators.AbstractSpliterator<>(
            src.estimateSize() / batchSize,
            src.characteristics()) {

            @Override
            public boolean tryAdvance(java.util.function.Consumer<? super List<T>> action) {
                List<T> batch = new ArrayList<>(batchSize);
                for (int i = 0; i < batchSize; i++) {
                    if (!src.tryAdvance(batch::add)) break;
                }
                if (batch.isEmpty()) return false;
                action.accept(batch);
                return true;
            }
        }, false);
    }

    public static void main(String[] args) {
        // 기본 Spliterator 확인
        List<String> list = List.of("A", "B", "C", "D", "E");
        Spliterator<String> sp = list.spliterator();
        System.out.println("크기: " + sp.estimateSize());
        System.out.println("특성: " + sp.characteristics());

        // 배치 스트림 활용
        List<Integer> numbers = IntStream.rangeClosed(1, 10)
            .boxed().toList();

        batch(numbers.stream(), 3).forEach(b ->
            System.out.println("배치: " + b));
        // 배치: [1, 2, 3] → [4, 5, 6] → [7, 8, 9] → [10]
    }
}

학습 팁

Spliterator.characteristics()ORDERED, SORTED, SIZED 등의 힌트를 제공하면 스트림이 더 효율적으로 최적화합니다.

주의할 점

trySplit()을 잘못 구현하면 병렬 스트림에서 데이터 누락이나 중복이 발생합니다. 반드시 원소를 정확히 분할하세요.

자주 묻는 질문

Spliterator란 무엇인가요?

Spliterator 의 분할-순회 원리와 커스텀 구현을 알아봅니다.

Spliterator 학습 시 주의할 점은 무엇인가요?

trySplit() 을 잘못 구현하면 병렬 스트림에서 데이터 누락이나 중복이 발생합니다. 반드시 원소를 정확히 분할하세요.