0Pricing
Java Academy · 강의

Spliterator: 병렬 처리를 위한 분할

도메인 데이터를 분할 가능한 스트림 원본으로 제공하는 사용자 지정 Spliterator를 구현합니다.

Spliterator: 병렬 처리를 위한 분할은(는) CoddyKit의 무료 Java Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Java Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Java Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

Spliterator란 무엇입니까

Spliterator(분할 가능한 반복자)는 스트림을 구성하는 핵심 메커니즘입니다. 요소를 반복하고 병렬 처리를 위해 스스로 두 부분으로 분할할 수 있습니다.

Spliterator의 핵심 메서드

핵심 메서드는 네 가지입니다. tryAdvance(요소 하나 처리), forEachRemaining(남은 요소 모두 처리), trySplit(두 부분으로 분할), estimateSize(요소 수 추정)입니다.

Spliterator<Integer> sp = List.of(1,2,3,4,5,6).spliterator();
Spliterator<Integer> half = sp.trySplit(); // splits off first ~half
half.forEachRemaining(System.out::println); // 1 2 3
sp.forEachRemaining(System.out::println);   // 4 5 6

Spliterator의 특성

Spliterator는 비트 플래그를 사용하여 다음 특성을 선언합니다. SIZED, ORDERED, DISTINCT, SORTED, NONNULL, IMMUTABLE, CONCURRENT, SUBSIZED.

Spliterator<String> sp = List.of("a","b","c").spliterator();
System.out.println(Integer.toBinaryString(sp.characteristics()));
// Characteristics include ORDERED, SIZED, SUBSIZED

trySplit의 작동 방식

trySplit()은 남은 요소의 대략 절반을 포함하는 새 Spliterator를 반환합니다. 원래 Spliterator는 나머지 절반을 포함합니다. 분할할 수 없으면 null을 반환합니다.

// ArrayList Spliterator splits efficiently at midpoint:
// [0,1,2,3,4,5] -> [0,1,2] (new) + [3,4,5] (original)

사용자 지정 Spliterator 만들기

Spliterator<T>를 구현하여 사용자 지정 자료 구조를 스트림 소스로 노출하십시오. 병렬 처리를 활성화하려면 trySplit을 정의하십시오.

public class RangeSpliterator implements Spliterator<Integer> {
    private int start, end;
    public RangeSpliterator(int start, int end) { this.start=start; this.end=end; }
    public boolean tryAdvance(Consumer<? super Integer> action) {
        if (start >= end) return false;
        action.accept(start++); return true;
    }
    public Spliterator<Integer> trySplit() {
        int mid = (start + end) / 2;
        if (mid <= start) return null;
        RangeSpliterator prefix = new RangeSpliterator(start, mid);
        this.start = mid; return prefix;
    }
    public long estimateSize() { return end - start; }
    public int characteristics() { return ORDERED | SIZED | SUBSIZED | IMMUTABLE; }
}

Spliterator에서 스트림 만들기

StreamSupport.stream(spliterator, parallel)을 사용하여 모든 Spliterator에서 스트림을 만드십시오. 이는 사용자 지정 데이터 소스와 스트림 API를 연결하는 다리입니다.

Spliterator<Integer> sp = new RangeSpliterator(0, 1_000_000);
Stream<Integer> stream = StreamSupport.stream(sp, true); // true = parallel
long count = stream.filter(n -> n % 2 == 0).count();
System.out.println(count); // 500000

이진 트리를 위한 Spliterator

사용자 지정 Spliterator를 사용하면 트리와 같은 목록이 아닌 구조에서도 병렬 처리를 활성화할 수 있습니다. trySplit은 왼쪽 하위 트리의 Spliterator를 반환하고 오른쪽 하위 트리는 현재 Spliterator에 남겨 둡니다.

병렬 처리 효율과 분할 품질

병렬 스트림은 각 작업 단위가 단일 스레드에서 처리할 수 있을 만큼 작아질 때까지 재귀적으로 분할합니다. 효율적으로 분할하려면 estimateSize가 정확해야 하고 각 분할 결과의 크기가 대략 같아야 합니다.

대량 처리를 위한 forEachRemaining

분할이 필요하지 않다면 forEachRemaining을 재정의하여 일괄 처리를 수행하십시오. 이렇게 하면 반복문에서 tryAdvance를 요소마다 호출할 때 발생하는 오버헤드를 피할 수 있습니다.

@Override
public void forEachRemaining(Consumer<? super Integer> action) {
    for (int i = start; i < end; i++) action.accept(i);
    start = end; // mark as exhausted
}

Spliterator와 Iterator 비교

Iterator: 순차 처리만 가능하고 크기 힌트와 분할 기능이 없습니다. Spliterator: 병렬 처리가 가능하며 특성과 크기 추정값을 제공하고 스트림 API를 위해 설계되었습니다.

확인 문제

분할할 수 없을 때 trySplit()은 무엇을 반환합니까?

복습

Spliterator는 병렬 스트림의 엔진입니다. 사용자 지정 자료 구조를 스트림으로 노출하려면 tryAdvance, trySplit, estimateSize, characteristics를 구현하십시오. StreamSupport.stream(sp, true)를 사용하면 병렬 처리를 시작할 수 있습니다.

자주 묻는 질문

“Spliterator: 병렬 처리를 위한 분할” 강의는 무료인가요?

네 — “Spliterator: 병렬 처리를 위한 분할” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Java Academy 강의 전체를 잠금 해제할 수 있습니다. Java Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“Spliterator: 병렬 처리를 위한 분할”에서 뭘 배우나요?

도메인 데이터를 분할 가능한 스트림 원본으로 제공하는 사용자 지정 Spliterator를 구현합니다. 브라우저에서 직접 실행하는 실습 코드로 Java Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Java Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Java Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.

“Spliterator: 병렬 처리를 위한 분할” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Java Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Java Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 중첩 컬렉션에 flatMap 사용
  2. 병렬 스트림: 성능과 주의점
  3. Spliterator: 병렬 처리를 위한 분할
  4. iterate와 generate를 사용한 무한 스트림
← Java Academy(으)로 돌아가기