Java Spliterator는 네 가지 반복자 중 하나입니다 – Enumeration, Iterator, ListIterator, 그리고 Spliterator.
Java Spliterator
Iterator와 ListIterator와 마찬가지로, Spliterator는 Java Iterator로서 List 구현 객체에서 요소를 하나씩 반복하는 데 사용됩니다. Java Spliterator에 대해 알아둬야 할 중요한 점들은 다음과 같습니다:
- Java Spliterator는 Java Collection API의 인터페이스입니다.
- Spliterator는 Java 8 릴리스에서
java.util
패키지에 도입되었습니다. - 병렬 프로그래밍 기능을 지원합니다.
- Collection API와 Stream API 클래스 모두에 사용할 수 있습니다.
- Collection 또는 API 객체에 대한 특성을 제공합니다.
- 이 Iterator는 Map 구현 클래스에는 사용할 수 없습니다.
- 이는
tryAdvance()
메서드를 사용하여 여러 스레드에서 개별적으로 요소를 반복하여 병렬 처리를 지원합니다. - 이는
forEachRemaining()
메서드를 사용하여 단일 스레드에서 요소를 순차적으로 반복합니다. - 이는
trySplit()
메서드를 사용하여 자체를 서브 스플리터로 나누어 병렬 처리를 지원합니다. - 스플리터는 데이터의 순차 및 병렬 처리를 지원합니다.
스플리터 자체는 병렬 프로그래밍 동작을 제공하지 않습니다. 그러나 이를 지원하기 위해 일부 메서드를 제공합니다. 개발자는 스플리터 인터페이스 메서드를 활용하고 포크/조인 프레임워크를 사용하여 병렬 프로그래밍을 구현해야 합니다(한 가지 좋은 접근 방법).
스플리터의 주요 기능
- 소스 데이터를 분할합니다.
- 소스 데이터를 처리합니다.
Java Spliterator 클래스 다이어그램
다음 다이어그램은 Java Spliterator 인터페이스의 클래스 다이어그램을 보여줍니다. 많은 필드와 메서드가 있습니다.
Java Spliterator 메서드
이 섹션에서는 유용한 설명과 함께 Java Spliterator 메서드를 한 줄씩 나열합니다.
- int characteristics(): 이 Spliterator 및 해당 요소의 특성 집합을 반환합니다.
- long estimateSize(): forEachRemaining() 탐색 시 만나게 될 요소의 개수를 추정하여 반환하거나, 무한하거나, 알 수 없거나, 계산하기에 너무 비용이 많이 드는 경우 Long.MAX_VALUE를 반환합니다.
- default void forEachRemaining(Consumer action): 남은 모든 요소에 대해 주어진 작업을 현재 스레드에서 순차적으로 수행하거나 작업이 예외를 throw하는 경우까지 수행합니다.
- default Comparator getComparator(): 이 Spliterator의 소스가 Comparator에 의해 정렬된 경우 해당 Comparator를 반환합니다.
- default long getExactSizeIfKnown(): 이 Spliterator가 SIZED이면 estimateSize()를 반환하는 편리한 메서드이며, 그렇지 않으면 -1을 반환합니다.
- default boolean hasCharacteristics(int characteristics): 이 Spliterator의 특성()이 주어진 특성을 모두 포함하는 경우 true를 반환합니다.
- boolean tryAdvance(Consumer action): 남은 요소가 있는 경우 주어진 작업을 수행하고 true를 반환하고, 그렇지 않으면 false를 반환합니다.
- 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의 장점
- Iterator 및 ListIterator와 달리 병렬 프로그래밍 기능을 지원합니다.
- Iterator 및 ListIterator와 달리 데이터의 순차적 및 병렬 처리를 지원합니다.
- 다른 반복자들과 비교하여 더 나은 성능을 제공합니다.
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