자바 스플리터
Java Spliterator는 Enumeration, ListIterator 및 Spliterator의 네 가지 반복자 중 하나입니다.
자바 스플리터
Iterator 및 ListIterator와 마찬가지로 Spliterator는 List 구현 객체에서 요소를 하나씩 반복하는 데 사용되는 Java Iterator입니다. Java Spliterator에 대한 몇 가지 중요한 사항은 다음과 같습니다.
- Java Spliterator는 Java Collection API의 인터페이스입니다.
- Spliterator는
java.util
패키지의 Java 8 릴리스에 도입되었습니다. - 병렬 프로그래밍 기능을 지원합니다.
- Collection API와 Stream API 클래스 모두에 사용할 수 있습니다.
- 컬렉션 또는 API 개체에 대한 특성을 제공합니다.
- Map 구현 클래스에는 이 Iterator를 사용할 수 없습니다.
tryAdvance()
메서드를 사용하여 병렬 처리를 지원하기 위해 여러 스레드에서 요소를 개별적으로 반복합니다.forEachRemaining()
메서드를 사용하여 단일 스레드에서 요소를 순차적으로 반복합니다.trySplit()
메서드를 사용하여 병렬 처리를 지원하기 위해 Sub-Spliterator로 분할합니다.- Spliterator는 데이터의 순차 및 병렬 처리를 모두 지원합니다.
Spliterator 자체는 병렬 프로그래밍 동작을 제공하지 않습니다. 그러나 이를 지원하는 몇 가지 방법을 제공합니다. 개발자는 Spliterator 인터페이스 메서드를 활용하고 Fork/Join Framework를 사용하여 병렬 프로그래밍을 구현해야 합니다(좋은 방법 중 하나).
Spliterator의 주요 기능
- 소스 데이터 분할.
- 소스 데이터 처리
Java Spliterator 클래스 다이어그램
Java Spliterator 메서드
이 섹션에서는 유용한 설명과 함께 모든 Java Spliterator 메서드를 하나씩 나열합니다.
- int characteristics(): 이 Spliterator 및 해당 요소의 특성 집합을 반환합니다.
- long EstimateSize(): forEachRemaining() 순회에서 마주칠 수 있는 요소 수의 추정치를 반환하거나 무한하거나 알 수 없거나 계산하기에 너무 비싼 경우 Long.MAX_VALUE를 반환합니다.
- default void forEachRemaining(Consumer action): 모든 요소가 처리되거나 작업이 예외를 throw할 때까지 현재 스레드에서 순차적으로 나머지 각 요소에 대해 지정된 작업을 수행합니다.
- 기본 Comparator getComparator(): 이 Spliterator의 소스가 Comparator에 의해 SORTED이면 해당 Comparator를 반환합니다.
- default long getExactSizeIfKnown(): 이 Spliterator가 SIZED인 경우 EstimateSize()를 반환하고 그렇지 않으면 -1을 반환하는 편리한 메서드입니다.
- 기본 부울 hasCharacteristics(int 특성): 이 Spliterator의 특성()이 주어진 특성을 모두 포함하는 경우 true를 반환합니다.
- boolean tryAdvance(Consumer action): 남아있는 요소가 있으면 해당 요소에 대해 주어진 작업을 수행하고 true를 반환합니다. 그렇지 않으면 거짓을 반환합니다.
- 분할기 trySplit(): 이 분할기를 분할할 수 있는 경우 요소를 포함하는 분할기를 반환합니다. 이 요소는 이 메서드에서 반환될 때 이 분할기에 포함되지 않습니다.
Java Spliterator 예제
이 섹션에서는 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<String> names = new ArrayList<>();
names.add("Rams");
names.add("Posa");
names.add("Chinni");
// Getting Spliterator
Spliterator<String> namesSpliterator = names.spliterator();
// Traversing elements
namesSpliterator.forEachRemaining(System.out::println);
}
}
산출:-
Rams
Posa
Chinni
위의 프로그램과 출력을 관찰하면 이 Spliterator.forEachRemaining() 메서드가 ArrayList.foreach()와 같은 방식으로 작동한다는 것을 쉽게 이해할 수 있습니다. 예, 둘 다 비슷한 방식으로 작동합니다.
스플리터의 장점
- Iterator 및 ListIterator와 달리 병렬 프로그래밍 기능을 지원합니다.
- Iterator 및 ListIterator와 달리 데이터의 순차 및 병렬 처리를 모두 지원합니다.
- 다른 Iterator와 비교할 때 더 나은 성능을 제공합니다.
반복자 대 분할자
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 문서