Java spliterator что это
Перейти к содержимому

Java spliterator что это

  • автор:

Сплитератор Java

Java Spliterator — это один из четырех итераторов — Enumeration, ListIterator и Spliterator.

Сплитератор Java

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

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

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

Основные функции Spliterator
  • Разделение исходных данных.
  • Обработка исходных данных.

Диаграмма классов Java Spliterator

Методы разделения Java

В этом разделе мы перечислим все методы Java Spliterator один за другим с некоторым полезным описанием.

  1. int характеристики(): возвращает набор характеристик этого разветвителя и его элементов.
  2. длинная оценкаSize(): возвращает оценку количества элементов, которые будут обнаружены при обходе forEachRemaining(), или возвращает значение Long.MAX_VALUE, если число элементов бесконечно, неизвестно или слишком дорого для вычисления.
  3. по умолчанию void forEachRemaining(действие потребителя): выполняет указанное действие для каждого оставшегося элемента последовательно в текущем потоке, пока все элементы не будут обработаны или пока действие не вызовет исключение.
  4. Компаратор по умолчанию getComparator(): если источник этого разделителя СОРТИРОВАН компаратором, возвращает этот компаратор.
  5. длинный по умолчанию getExactSizeIfKnown(): удобный метод, который возвращает AssessmentSize(), если этот разделитель SIZED, иначе -1.
  6. логическое значение по умолчанию hasCharacteristics(int характеристики): возвращает значение true, если характеристики этого разветвителя() содержат все заданные характеристики.
  7. boolean tryAdvance(Consumer action): если оставшийся элемент существует, выполняет над ним заданное действие, возвращая true; иначе возвращает ложь.
  8. Сплитератор trySplit(): если этот сплитератор может быть разделен, возвращает сплитератор, покрывающий элементы, которые после возврата из этого метода не будут покрыты этим сплитератором.

Пример сплиттера Java

В этом разделе мы обсудим, как создать объект Java Spliterator с помощью spliterator(), и разработаем простой пример.

import java.util.Spliterator; import java.util.ArrayList; import java.util.List; public class SpliteratorSequentialIteration < public static void main(String[] args) < Listnames = new ArrayList<>(); names.add("Rams"); names.add("Posa"); names.add("Chinni"); // Getting Spliterator Spliterator namesSpliterator = names.spliterator(); // Traversing elements namesSpliterator.forEachRemaining(System.out::println); > > 
Rams Posa Chinni 

Если мы посмотрим на приведенную выше программу и вывод, мы легко поймем, что этот метод Spliterator.forEachRemaining() работает так же, как ArrayList.foreach(). Да, оба работают одинаково.

Преимущества сплитератора

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

Итератор против Сплитератора

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

Как работает Java Spliterator

Здесь можно и без spliterator ‘а. Способы делятся на три типа.

    изменяется исходный список
    .replaceAll() (спасибо @zRrr!)

List list = Arrays.asList(1, 2, 3); list.replaceAll(x -> x * 2); 
for (int i = 0; i
List listTransformed = list .stream() .map(x -> x * 2) .collect(Collectors.toList()); 
List listTransformed = new ArrayList<>(); for (int x : list)
Lists.transform(list, x -> x * 2); 

Варианты, когда в результате получается массив вместо списка:

int[] array = list .stream() .mapToInt(x -> x * 2) .toArray(); 

Как реализовать собственный стрим?

Любой стрим определяется его сплитератором. Spliterator – это специальный разделяемый внутренний итератор.

Есть много способов получить готовый сплитератор или стрим, но чтобы создать полностью свою специфическую логику перебора элементов, придется написать собственный сплитератор.

Поток создается из сплитератора одним из статических методов класса StreamSupport . Вызов его методов осуществляется самим фреймворком. Вкратце его работа выглядит так:
• Элементы перебираются методом tryAdvance , пока он не выдаст false . Через параметр action к элементу применяются последующие операции.
• При применении промежуточных и терминальных операций учитываются характеристики потока, изначально задаваемые методом characteristics .
• Когда обработка стрима распараллеливается, методом trySplit от начала последовательности элементов «откусывается» часть, и возвращается завернутой в новый сплитератор. Текущий продолжает идти по оставшемуся хвосту. В идеале, по возможности эта часть – половина элементов потока. Если разделить уже нельзя, возвращается null .

Подробно и доступно последовательность действий для реализации описана в статье на хабре.

Spliterators. Spliterator Метод

Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.

Перегрузки

Создает объект , Spliterator охватывающий элементы заданного массива, используя настраиваемый набор характеристик разделителя.

Создает объект , Spliterator используя заданную коллекцию java.util.Collection#iterator() в качестве источника элементов и сообщая о ней java.util.Collection#size() в качестве исходного размера.

Создает объект , Spliterator используя заданный Iterator объект в качестве источника элементов и с заданным изначально сообщаемого размера.

Создает объект, Spliterator охватывающий диапазон элементов заданного массива, используя настраиваемый набор характеристик разделителя.

Spliterator(Object[], SpliteratorCharacteristics)

Создает объект , Spliterator охватывающий элементы заданного массива, используя настраиваемый набор характеристик разделителя.

[Android.Runtime.Register("spliterator", "([Ljava/lang/Object;I)Ljava/util/Spliterator;", "", ApiSince=24)] [Java.Interop.JavaTypeParameters(new System.String[] < "T" >)] public static Java.Util.ISpliterator? Spliterator (Java.Lang.Object[]? array, Java.Util.SpliteratorCharacteristics additionalCharacteristics);
[] [)>] static member Spliterator : Java.Lang.Object[] * Java.Util.SpliteratorCharacteristics -> Java.Util.ISpliterator
Параметры

Массив, который, как предполагается, неизмен во время использования

additionalCharacteristics SpliteratorCharacteristics

Дополнительные характеристики разделителя источника или элементов этого разделителя за пределами SIZED и SUBSIZED которые всегда сообщаются

Возвращаемое значение

Разделитель для массива

Комментарии

Создает объект , Spliterator охватывающий элементы заданного массива, используя настраиваемый набор характеристик разделителя.

Этот метод предоставляется в качестве удобства реализации для разделителей, которые хранят части своих элементов в массивах и нуждаются в тонком управлении характеристиками сплитатора. В большинстве других ситуаций, в которых требуется разделитель для массива, следует использовать Arrays#spliterator(Object[]) .

Возвращаемый разделитель всегда сообщает о характеристиках SIZED и SUBSIZED . Вызывающий объект может предоставить дополнительные характеристики для отчета разбителя; Обычно дополнительно указываются IMMUTABLE и ORDERED .

Части этой страницы являются изменениями, основанными на работе, созданной и совместно используемой проектом Android и используемой в соответствии с условиями, Creative Commons 2.5 Attribution License.

Применяется к

Spliterator(ICollection, SpliteratorCharacteristics)

Создает объект , Spliterator используя заданную коллекцию java.util.Collection#iterator() в качестве источника элементов и сообщая о ней java.util.Collection#size() в качестве исходного размера.

[Android.Runtime.Register("spliterator", "(Ljava/util/Collection;I)Ljava/util/Spliterator;", "", ApiSince=24)] [Java.Interop.JavaTypeParameters(new System.String[] < "T" >)] public static Java.Util.ISpliterator? Spliterator (System.Collections.ICollection? c, Java.Util.SpliteratorCharacteristics characteristics);
[] [)>] static member Spliterator : System.Collections.ICollection * Java.Util.SpliteratorCharacteristics -> Java.Util.ISpliterator
Параметры

characteristics SpliteratorCharacteristics

Характеристики источника или элементов этого разделителя. Характеристики SIZED и SUBSIZED дополнительно сообщаются, если CONCURRENT не предоставлено.

Возвращаемое значение

Разделитель из итератора

Комментарии

Создает объект , Spliterator используя заданную коллекцию java.util.Collection#iterator() в качестве источника элементов и сообщая о ней java.util.Collection#size() в качестве исходного размера.

Разделитель — em <>late-binding, наследует fail-fast итератора коллекции и реализует trySplit , чтобы разрешить ограниченный параллелизм.

Части этой страницы являются изменениями, основанными на работе, созданной и совместно используемой проектом Android и используемой в соответствии с условиями, Creative Commons 2.5 Attribution License.

Применяется к

Spliterator(IIterator, Int64, SpliteratorCharacteristics)

Создает объект , Spliterator используя заданный Iterator объект в качестве источника элементов и с заданным изначально сообщаемого размера.

[Android.Runtime.Register("spliterator", "(Ljava/util/Iterator;JI)Ljava/util/Spliterator;", "", ApiSince=24)] [Java.Interop.JavaTypeParameters(new System.String[] < "T" >)] public static Java.Util.ISpliterator? Spliterator (Java.Util.IIterator? iterator, long size, Java.Util.SpliteratorCharacteristics characteristics);
[] [)>] static member Spliterator : Java.Util.IIterator * int64 * Java.Util.SpliteratorCharacteristics -> Java.Util.ISpliterator
Параметры

Итератор для источника

Количество элементов в источнике, которые должны быть представлены как начальные estimateSize

characteristics SpliteratorCharacteristics

Характеристики источника или элементов этого разделителя. Характеристики SIZED и SUBSIZED дополнительно сообщаются, если CONCURRENT не предоставлено.

Возвращаемое значение

Разделитель из итератора

Комментарии

Создает объект , Spliterator используя заданный Iterator объект в качестве источника элементов и с заданным изначально сообщаемого размера.

Разделитель не late-binding, наследует fail-fast итератора и реализует trySplit , чтобы разрешить ограниченный параллелизм.

Обход элементов должен выполняться с помощью разделителя. Поведение разделения и обхода является неопределенным, если итератор работает с после возврата разделителя или изначально сообщаемый размер не равен фактическому количеству элементов в источнике.

Части этой страницы являются изменениями, основанными на работе, созданной и совместно используемой проектом Android и используемой в соответствии с условиями, Creative Commons 2.5 Attribution License.

Применяется к

Spliterator(Object[], Int32, Int32, SpliteratorCharacteristics)

Создает объект, Spliterator охватывающий диапазон элементов заданного массива, используя настраиваемый набор характеристик разделителя.

[Android.Runtime.Register("spliterator", "([Ljava/lang/Object;III)Ljava/util/Spliterator;", "", ApiSince=24)] [Java.Interop.JavaTypeParameters(new System.String[] < "T" >)] public static Java.Util.ISpliterator? Spliterator (Java.Lang.Object[]? array, int fromIndex, int toIndex, Java.Util.SpliteratorCharacteristics additionalCharacteristics);
[] [)>] static member Spliterator : Java.Lang.Object[] * int * int * Java.Util.SpliteratorCharacteristics -> Java.Util.ISpliterator
Параметры

Массив, который, как предполагается, неизмен во время использования

Минимальный индекс (включительно) для покрытия

Один за наибольшим индексом для покрытия

additionalCharacteristics SpliteratorCharacteristics

Дополнительные характеристики разделителя источника или элементов этого разделителя за пределами SIZED и SUBSIZED которые всегда сообщаются

Возвращаемое значение

Разделитель для массива

Комментарии

Создает объект, Spliterator охватывающий диапазон элементов заданного массива, используя настраиваемый набор характеристик разделителя.

Этот метод предоставляется в качестве удобства реализации для разделителей, которые хранят части своих элементов в массивах и нуждаются в тонком управлении характеристиками сплитатора. В большинстве других ситуаций, в которых требуется разделитель для массива, следует использовать Arrays#spliterator(Object[]) .

Возвращаемый разделитель всегда сообщает о характеристиках SIZED и SUBSIZED . Вызывающий объект может предоставить дополнительные характеристики для отчета разбителя; Обычно дополнительно указываются IMMUTABLE и ORDERED .

Части этой страницы являются изменениями, основанными на работе, созданной и совместно используемой проектом Android и используемой в соответствии с условиями, Creative Commons 2.5 Attribution License.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *