HihoBookStudy / EffectiveJava

이펙티브 자바 북스터디입니다.
1 stars 0 forks source link

[Item 48] spliterator 메서드 #40

Open zpqmdh opened 1 week ago

zpqmdh commented 1 week ago

p. 293 : 직접 구현한 Stream, Iterable, Collection이 병렬화의 이점을 누리려면 spliterator 메서드를 반드시 재정의하고 결과 스트림의 병렬화 성능을 강도 높게 태스트 하라.

라는 내용이 있는데 spliterator 메서드에 대해서 더 자세히 설명해주실 수 있나요?

ForteEscape commented 1 week ago

Q. spliterator 메서드에 대해서 더 자세히 설명해주실 수 있나요?

A.

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Spliterator;

public class SplitTest {

    public static void main(String[] args) {
        List<String> wordList = new ArrayList<>();

        wordList.add("apple");
        wordList.add("banana");
        wordList.add("grape");
        wordList.add("orange");
        wordList.add("mango");
        wordList.add("watermelon");

        Iterator<String> iterator = wordList.iterator();

        // 일반적인 Iterator를 통한 순차 처리
        System.out.println("기존의 iterator를 사용한 순차 출력");
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }

        System.out.println("=====");

        // trySplit 메서드를 사용하지 않은 상태의 Spliterator 처리
        // 순차 처리와 동일하게 동작합니다.
        System.out.println("trySplit 을 사용하지 않은 Spliterator 의 출력");
        Spliterator<String> spliterator = wordList.spliterator();

        // spliterator는 forEachRemaining 메서드를 통해 내부 요소들을 순회하여 처리할 함수를 정의할 수 있습니다.
        spliterator.forEachRemaining(System.out::println);

        System.out.println("=====");

        // trySplit 메서드를 사용한 상태의 Spliterator 처리
        // 데이터를 정확히 절반으로 나누어 순차 처리합니다. 이때 순서는 고려되지 않음에 유의합니다.
        Spliterator<String> spliterator1 = wordList.spliterator();
        Spliterator<String> spliterator2 = spliterator1.trySplit();

        System.out.println("Spliterator1의 출력");
        spliterator1.forEachRemaining(System.out::println);
        System.out.println("=====");
        System.out.println("Spliterator2의 출력");
        spliterator2.forEachRemaining(System.out::println);
    }
}