Java Spliterator

Java Spliterator는 네 가지 반복자 중 하나입니다 – Enumeration, Iterator, ListIterator, 그리고 Spliterator.

Java Spliterator

Iterator와 ListIterator와 마찬가지로, Spliterator는 Java Iterator로서 List 구현 객체에서 요소를 하나씩 반복하는 데 사용됩니다. Java Spliterator에 대해 알아둬야 할 중요한 점들은 다음과 같습니다:

  1. Java Spliterator는 Java Collection API의 인터페이스입니다.
  2. Spliterator는 Java 8 릴리스에서 java.util 패키지에 도입되었습니다.
  3. 병렬 프로그래밍 기능을 지원합니다.
  4. Collection API와 Stream API 클래스 모두에 사용할 수 있습니다.
  5. Collection 또는 API 객체에 대한 특성을 제공합니다.
  6. 이 Iterator는 Map 구현 클래스에는 사용할 수 없습니다.
  7. 이는 tryAdvance() 메서드를 사용하여 여러 스레드에서 개별적으로 요소를 반복하여 병렬 처리를 지원합니다.
  8. 이는 forEachRemaining() 메서드를 사용하여 단일 스레드에서 요소를 순차적으로 반복합니다.
  9. 이는 trySplit() 메서드를 사용하여 자체를 서브 스플리터로 나누어 병렬 처리를 지원합니다.
  10. 스플리터는 데이터의 순차 및 병렬 처리를 지원합니다.

스플리터 자체는 병렬 프로그래밍 동작을 제공하지 않습니다. 그러나 이를 지원하기 위해 일부 메서드를 제공합니다. 개발자는 스플리터 인터페이스 메서드를 활용하고 포크/조인 프레임워크를 사용하여 병렬 프로그래밍을 구현해야 합니다(한 가지 좋은 접근 방법).

스플리터의 주요 기능

  • 소스 데이터를 분할합니다.
  • 소스 데이터를 처리합니다.

Java Spliterator 클래스 다이어그램

다음 다이어그램은 Java Spliterator 인터페이스의 클래스 다이어그램을 보여줍니다. 많은 필드와 메서드가 있습니다.

Java Spliterator 메서드

이 섹션에서는 유용한 설명과 함께 Java Spliterator 메서드를 한 줄씩 나열합니다.

  1. int characteristics(): 이 Spliterator 및 해당 요소의 특성 집합을 반환합니다.
  2. long estimateSize(): forEachRemaining() 탐색 시 만나게 될 요소의 개수를 추정하여 반환하거나, 무한하거나, 알 수 없거나, 계산하기에 너무 비용이 많이 드는 경우 Long.MAX_VALUE를 반환합니다.
  3. default void forEachRemaining(Consumer action): 남은 모든 요소에 대해 주어진 작업을 현재 스레드에서 순차적으로 수행하거나 작업이 예외를 throw하는 경우까지 수행합니다.
  4. default Comparator getComparator(): 이 Spliterator의 소스가 Comparator에 의해 정렬된 경우 해당 Comparator를 반환합니다.
  5. default long getExactSizeIfKnown(): 이 Spliterator가 SIZED이면 estimateSize()를 반환하는 편리한 메서드이며, 그렇지 않으면 -1을 반환합니다.
  6. default boolean hasCharacteristics(int characteristics): 이 Spliterator의 특성()이 주어진 특성을 모두 포함하는 경우 true를 반환합니다.
  7. boolean tryAdvance(Consumer action): 남은 요소가 있는 경우 주어진 작업을 수행하고 true를 반환하고, 그렇지 않으면 false를 반환합니다.
  8. Spliterator trySplit(): 이 spliterator를 분할할 수 있는 경우, 이 메서드에서 반환된 Spliterator로 covered되지 않을 요소를 포함하는 Spliterator를 반환합니다.

Java Spliterator 예제

이 섹션에서는 Java Spliterator 객체를 만드는 방법 및 간단한 예제를 개발하는 방법에 대해 설명하겠습니다.

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

public class SpliteratorSequentialIteration
{
  public static void main(String[] args) 
  {
	List names = new ArrayList<>();
	names.add("Rams");
	names.add("Posa");
	names.add("Chinni");
		
	// Spliterator 가져오기
	Spliterator namesSpliterator = names.spliterator();
		
	// 요소 순회
	namesSpliterator.forEachRemaining(System.out::println);			
   }
}

출력:-

Rams
Posa
Chinni

위 프로그램 및 출력을 관찰하면 Spliterator.forEachRemaining() 메서드가 ArrayList.foreach()와 동일한 방식으로 작동한다는 것을 쉽게 이해할 수 있습니다. 예, 둘 다 유사하게 작동합니다.

Spliterator의 장점

  1. Iterator 및 ListIterator와 달리 병렬 프로그래밍 기능을 지원합니다.
  2. Iterator 및 ListIterator와 달리 데이터의 순차적 및 병렬 처리를 지원합니다.
  3. 다른 반복자들과 비교하여 더 나은 성능을 제공합니다.

Iterator 대 Spliterator

Iterator Spliterator
Introduced in Java 1.2. Introduced in Java 1.8.
It is an Iterator for whole Collection API. It is an Iterator for both Collection and Stream API, except Map implemented classes.
It is an Universal Iterator. It is NOT an Universal Iterator.
It does NOT support Parallel Programming. It supports Parallel Programming.

이것으로 Java에서 Spliterator에 관한 모든 것입니다. 참조: API 문서

Source:
https://www.digitalocean.com/community/tutorials/java-spliterator