Сплитератор Java
Java Spliterator — это один из четырех итераторов — Enumeration, ListIterator и Spliterator.
Сплитератор Java
Подобно Iterator и ListIterator, Spliterator — это итератор Java, который используется для последовательной итерации элементов из реализованного объекта List. Некоторые важные моменты о Java Spliterator:
- Java Spliterator – это интерфейс в Java Collection API.
- Spliterator представлен в выпуске Java 8 в пакете java.util .
- Он поддерживает функции параллельного программирования.
- Мы можем использовать его как для классов Collection API, так и для классов Stream API.
- Он предоставляет характеристики коллекций или объектов API.
- Нельзя использовать этот итератор для классов, реализованных на карте.
- Он использует метод tryAdvance() для индивидуальной итерации элементов в нескольких потоках для поддержки параллельной обработки.
- Он использует метод forEachRemaining() для последовательной итерации элементов в одном потоке.
- Он использует метод trySplit() , чтобы разделить себя на вспомогательные разделители для поддержки параллельной обработки.
- Spliterator поддерживает как последовательную, так и параллельную обработку данных.
Spliterator сам по себе не поддерживает параллельное программирование. Тем не менее, он предоставляет некоторые методы для его поддержки. Разработчики должны использовать методы интерфейса Spliterator и реализовывать параллельное программирование с помощью Fork/Join Framework (один из хороших подходов).
Основные функции Spliterator
- Разделение исходных данных.
- Обработка исходных данных.
Диаграмма классов Java Spliterator
Методы разделения Java
В этом разделе мы перечислим все методы Java Spliterator один за другим с некоторым полезным описанием.
- int характеристики(): возвращает набор характеристик этого разветвителя и его элементов.
- длинная оценкаSize(): возвращает оценку количества элементов, которые будут обнаружены при обходе forEachRemaining(), или возвращает значение Long.MAX_VALUE, если число элементов бесконечно, неизвестно или слишком дорого для вычисления.
- по умолчанию void forEachRemaining(действие потребителя): выполняет указанное действие для каждого оставшегося элемента последовательно в текущем потоке, пока все элементы не будут обработаны или пока действие не вызовет исключение.
- Компаратор по умолчанию getComparator(): если источник этого разделителя СОРТИРОВАН компаратором, возвращает этот компаратор.
- длинный по умолчанию getExactSizeIfKnown(): удобный метод, который возвращает AssessmentSize(), если этот разделитель SIZED, иначе -1.
- логическое значение по умолчанию hasCharacteristics(int характеристики): возвращает значение true, если характеристики этого разветвителя() содержат все заданные характеристики.
- boolean tryAdvance(Consumer action): если оставшийся элемент существует, выполняет над ним заданное действие, возвращая true; иначе возвращает ложь.
- Сплитератор 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(). Да, оба работают одинаково.
Преимущества сплитератора
- В отличие от Iterator и ListIterator, он поддерживает функции параллельного программирования.
- В отличие от Iterator и ListIterator, он поддерживает как последовательную, так и параллельную обработку данных.
- По сравнению с другими итераторами, он обеспечивает более высокую производительность.
Итератор против Сплитератора
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.