Java Spliterator

Java Spliterator – один из четырех итераторов: Перечисление (Enumeration), Iterator, ListIterator и Spliterator.

Java Spliterator

Как итератор и ListIterator, Spliterator представляет собой итератор Java, который используется для итерации по элементам одного за другим из объекта, реализующего List. Некоторые важные моменты о Java Spliterator:

  1. Java Spliterator – интерфейс в API Java Collection.
  2. Spliterator введен в релизе Java 8 в пакете java.util.
  3. Поддерживает функциональность параллельного программирования.
  4. Можно использовать как для API Collection, так и для классов Stream.
  5. Предоставляет характеристики объектов Collection или API.
  6. Этот итератор нельзя использовать для классов, реализующих Map.
  7. Он использует метод tryAdvance() для итерации элементов индивидуально в нескольких потоках для поддержки параллельной обработки.
  8. Он использует метод forEachRemaining() для последовательной итерации элементов в одном потоке.
  9. Он использует метод trySplit() для разделения себя на под-сплитераторы для поддержки параллельной обработки.
  10. Сплитератор поддерживает как последовательную, так и параллельную обработку данных.

Сам сплитератор не предоставляет функциональности параллельного программирования. Тем не менее, он предоставляет некоторые методы для его поддержки. Разработчики должны использовать методы интерфейса сплитератора и реализовать параллельное программирование, используя фреймворк Fork/Join (хороший подход).

Основные функциональности сплитератора

  • Разделение исходных данных.
  • Обработка исходных данных.

Диаграмма классов 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): Выполняет заданное действие для каждого оставшегося элемента последовательно в текущем потоке до тех пор, пока все элементы не будут обработаны или действие не вызовет исключение.
  4. default Comparator getComparator(): Если источник этого Spliterator отсортирован с использованием Comparator, возвращает этот Comparator.
  5. default long getExactSizeIfKnown(): Удобный метод, возвращающий estimateSize(), если этот Spliterator имеет размер (SIZED), иначе -1.
  6. default boolean hasCharacteristics(int characteristics): Возвращает true, если характеристики() этого Spliterator содержат все указанные характеристики.
  7. boolean tryAdvance(Consumer action): Если остался еще хотя бы один элемент, выполняет заданное действие над ним и возвращает true; в противном случае возвращает false.
  8. 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

  1. В отличие от Iterator и ListIterator, он поддерживает функциональность параллельного программирования.
  2. В отличие от Iterator и ListIterator, он поддерживает как последовательную, так и параллельную обработку данных.
  3. По сравнению с другими итераторами, он обеспечивает более высокую производительность.

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