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() 을 잘못 구현하면 병렬 스트림에서 데이터 누락이나 중복이 발생합니다. 반드시 원소를 정확히 분할하세요.
Continue Learning
Java 학습을 이어가세요
총 200개의 독립 HTML 학습 문서 중 하나입니다. 각 문서는 고유 URL과 canonical 메타데이터를 가집니다.