Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

Java에서 Iterator를 Spliterator로 변환하는 방법

Java 8부터 도입된 Spliterator는 기존 Iterator에 분할(split) 기능을 추가한 인터페이스로, 병렬 스트림 처리에 특히 유용합니다. 이 글에서는 Iterator 객체를 Spliterator로 변환하는 방법을 예제 코드와 함께 살펴보겠습니다.

핵심 메서드: Spliterators.spliteratorUnknownSize()

java.util.Spliterators 클래스가 제공하는 spliteratorUnknownSize() 메서드를 사용하면 크기를 미리 알 수 없는 Iterator를 손쉽게 Spliterator로 변환할 수 있습니다. 이 메서드는 두 개의 매개변수를 받습니다.

  • iterator: 변환할 대상 Iterator
  • characteristics: Spliterator의 특성을 나타내는 정수 값 (0은 특성 없음을 의미)

예제 코드

import java.util.*;

public class Demo {
    public static <T> Spliterator<T> getSpliterator(Iterator<T> iterator) {
        return Spliterators.spliteratorUnknownSize(iterator, 0);
    }

    public static void main(String[] args) {
        Iterator<Integer> myIter = Arrays.asList(56, 78, 99, 32, 100, 234).iterator();
        Spliterator<Integer> mySpliter = getSpliterator(myIter);
        System.out.println("Spliterator의 요소들 : ");
        mySpliter.forEachRemaining(System.out::println);
    }
}

실행 결과

Spliterator의 요소들 :
56
78
99
32
100
234

코드 설명

Demo 클래스에는 제네릭 타입 T를 받아 Spliterator를 반환하는 정적 메서드 getSpliterator()가 정의되어 있습니다. 이 메서드 내부에서는 Spliterators.spliteratorUnknownSize()를 호출하여 전달받은 Iterator를 변환합니다.

main 메서드에서는 Arrays.asList()로 생성한 리스트에서 iterator() 메서드를 호출하여 Iterator 객체를 얻습니다. 그런 다음 getSpliterator() 메서드에 이 iterator를 전달하여 Spliterator로 변환하고, 최종적으로 forEachRemaining() 메서드를 사용해 모든 요소를 콘솔에 출력합니다.

참고: 크기를 아는 경우의 변환

만약 컬렉션의 크기를 미리 알고 있다면 Spliterators.spliterator(iterator, size, characteristics) 메서드를 사용하는 것이 좋습니다. 크기 정보를 제공하면 Spliterator가 더 효율적으로 동작하며, 병렬 처리 시 작업 분할 성능도 향상됩니다.