Java Spliterator – один из четырех итераторов: Перечисление (Enumeration), Iterator, ListIterator и Spliterator.
Java Spliterator
Как итератор и ListIterator, Spliterator представляет собой итератор Java, который используется для итерации по элементам одного за другим из объекта, реализующего List. Некоторые важные моменты о Java Spliterator:
- Java Spliterator – интерфейс в API Java Collection.
- Spliterator введен в релизе Java 8 в пакете
java.util
. - Поддерживает функциональность параллельного программирования.
- Можно использовать как для API Collection, так и для классов Stream.
- Предоставляет характеристики объектов Collection или API.
- Этот итератор нельзя использовать для классов, реализующих Map.
- Он использует метод
tryAdvance()
для итерации элементов индивидуально в нескольких потоках для поддержки параллельной обработки. - Он использует метод
forEachRemaining()
для последовательной итерации элементов в одном потоке. - Он использует метод
trySplit()
для разделения себя на под-сплитераторы для поддержки параллельной обработки. - Сплитератор поддерживает как последовательную, так и параллельную обработку данных.
Сам сплитератор не предоставляет функциональности параллельного программирования. Тем не менее, он предоставляет некоторые методы для его поддержки. Разработчики должны использовать методы интерфейса сплитератора и реализовать параллельное программирование, используя фреймворк Fork/Join (хороший подход).
Основные функциональности сплитератора
- Разделение исходных данных.
- Обработка исходных данных.
Диаграмма классов Java Spliterator
На следующей диаграмме показана диаграмма классов интерфейса Java Spliterator. В ней много полей и методов.
Методы интерфейса Java Spliterator
В этом разделе мы будем перечислять все методы Java Spliterator один за другим с некоторым полезным описанием.
- int characteristics(): Возвращает набор характеристик этого Spliterator и его элементов.
- long estimateSize(): Возвращает оценку количества элементов, с которыми произойдет обход при использовании метода forEachRemaining(), или возвращает Long.MAX_VALUE в случае бесконечного, неизвестного или слишком дорогостоящего вычисления.
- default void forEachRemaining(Consumer action): Выполняет заданное действие для каждого оставшегося элемента последовательно в текущем потоке до тех пор, пока все элементы не будут обработаны или действие не вызовет исключение.
- default Comparator getComparator(): Если источник этого Spliterator отсортирован с использованием Comparator, возвращает этот Comparator.
- default long getExactSizeIfKnown(): Удобный метод, возвращающий estimateSize(), если этот Spliterator имеет размер (SIZED), иначе -1.
- default boolean hasCharacteristics(int characteristics): Возвращает true, если характеристики() этого Spliterator содержат все указанные характеристики.
- boolean tryAdvance(Consumer action): Если остался еще хотя бы один элемент, выполняет заданное действие над ним и возвращает true; в противном случае возвращает false.
- Spliterator trySplit(): Если этот Spliterator может быть разделен, возвращает Spliterator, охватывающий элементы, которые после выполнения этого метода не будут входить в область этого Spliterator.
Пример Java Spliterator
В этом разделе мы обсудим, как создать объект Java Spliterator с использованием 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 vs 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. |
Это все о Spliterator в Java. Ссылка: API Doc
Source:
https://www.digitalocean.com/community/tutorials/java-spliterator