Spec-Zone.ru › OpenJDK 24

Интерфейс Spliterator<T>

Параметры типа:
T - тип элементов, возвращаемых этим Spliterator
Все известные подинтерфейсы:
Spliterator.OfDouble, Spliterator.OfInt, Spliterator.OfLong, Spliterator.OfPrimitive<T,T_CONS,T_SPLITR>
Все известные реализующие классы:
Spliterators.AbstractDoubleSpliterator, Spliterators.AbstractIntSpliterator, Spliterators.AbstractLongSpliterator, Spliterators.AbstractSpliterator
public interface Spliterator<T>
Объект для обхода и разделения элементов источника. Источником элементов, охватываемых Spliterator, может быть, например, массив, Collection, канал ввода-вывода или функция-генератор.

Spliterator может обходить элементы по одному (tryAdvance()) или последовательно в блоке (forEachRemaining()).

Spliterator также может разделить некоторые свои элементы (используя trySplit()) как другой Spliterator, для использования в потенциально параллельных операциях. Операции, использующие Spliterator, который не может разделиться или делает это крайне несбалансированно или неэффективно, вряд ли получат выгоду от параллелизма. Обход и разделение исчерпывают элементы; каждый Spliterator пригоден только для одного массового вычисления.

Spliterator также сообщает набор characteristics() своей структуры, источника и элементов из ORDERED, DISTINCT, SORTED, SIZED, NONNULL, IMMUTABLE, CONCURRENT и SUBSIZED. Клиенты Spliterator могут использовать их для управления, специализации или упрощения вычислений. Например, Spliterator для Collection сообщил бы SIZED, Spliterator для Set сообщил бы DISTINCT, а Spliterator для SortedSet также сообщил бы SORTED. Характеристики сообщаются как простой объединённый битовый набор. Некоторые характеристики дополнительно ограничивают поведение метода; например, если ORDERED, методы обхода должны соответствовать своему документированному порядку. В будущем могут быть определены новые характеристики, поэтому разработчики не должны присваивать значения неперечисленным значениям.

Ожидается, что Spliterator, который не сообщает о IMMUTABLE или CONCURRENT, будет иметь документированную политику относительно: когда spliterator связывается с источником элементов; и обнаружения структурных помех в источнике элементов, обнаруженных после связывания. Spliterator с поздним связыванием связывается с источником элементов в момент первого обхода, первого разделения или первого запроса оценки размера, а не в момент создания Spliterator. Spliterator, который не является с поздним связыванием, связывается с источником элементов в момент создания или первого вызова любого метода. Изменения, внесённые в источник до связывания, отражаются при обходе Spliterator. После связывания Spliterator должен по возможности выбрасывать ConcurrentModificationException, если обнаружены структурные помехи. Spliterators, которые это делают, называются быстродействующими. Метод массового обхода (forEachRemaining()) Spliterator может оптимизировать обход и проверять структурные помехи после обхода всех элементов, а не проверять каждый элемент и немедленно завершать.

Spliterators могут предоставить оценку количества оставшихся элементов с помощью метода estimateSize(). В идеале, как отражено в характеристике SIZED, это значение соответствует точно количеству элементов, которые встретятся при успешном обходе. Однако, даже если оно не известно точно, оцененное значение всё равно может быть полезным для операций, выполняемых над источником, например, для определения того, предпочтительнее ли дальнейшее разделение или последовательный обход оставшихся элементов.

Несмотря на их очевидную полезность в параллельных алгоритмах, spliterators не должны быть потокобезопасными; вместо этого реализации параллельных алгоритмов, использующих spliterators, должны гарантировать, что spliterator используется только одной нитью за раз. Это обычно легко достигается с помощью последовательного ограничения потоков, что часто является естественным следствием типичных параллельных алгоритмов, работающих путём рекурсивного разбиения. Нить, вызывающая trySplit(), может передать возвращённый Spliterator другой нити, которая, в свою очередь, может пройтись по этому Spliterator или разбить его дальше. Поведение разделения и обхода не определено, если две или более нити работают одновременно с одним и тем же spliterator. Если исходная нить передает spliterator другой нити для обработки, лучше, чтобы это передача произошла до потребления любых элементов с tryAdvance(), так как некоторые гарантии (например, точность estimateSize() для SIZED spliterators) действительны только до начала обхода.

Представлены примитивные специализации подтипов Spliterator для int, long и double значений. Подтип по умолчанию реализаций tryAdvance(java.util.function.Consumer) и forEachRemaining(java.util.function.Consumer) упаковывают примитивные значения в экземпляры соответствующего класса-обёртки. Такая упаковка может подорвать любые преимущества производительности, полученные при использовании примитивных специализаций. Чтобы избежать упаковки, следует использовать соответствующие методы на основе примитивов. Например, Spliterator.OfPrimitive.tryAdvance(java.util.function.IntConsumer) и Spliterator.OfPrimitive.forEachRemaining(java.util.function.IntConsumer) должны использоваться вместо Spliterator.OfInt.tryAdvance(java.util.function.Consumer) и Spliterator.OfInt.forEachRemaining(java.util.function.Consumer). Обход примитивных значений с использованием методов упаковки не влияет на порядок, в котором значения, преобразованные в упакованные значения, встречаются.

Замечание API:

Spliterators, как и Iterator, предназначены для обхода элементов источника. API Spliterator был разработан для поддержки эффективного параллельного обхода в дополнение к последовательному обходу, поддерживая как разбиение, так и итерацию по отдельным элементам. Кроме того, протокол доступа к элементам через Spliterator разработан для наложения меньшей накладных расходов на элемент, чем Iterator, и для избежания неотъемлемой гонки при наличии отдельных методов для hasNext() и next().

Для изменяемых источников может возникнуть произвольное и недетерминированное поведение, если источник подвергается структурным изменениям (добавление, замена или удаление элементов) между моментом, когда Spliterator связывается со своим источником данных, и концом обхода. Например, такие помехи приведут к произвольным, недетерминированным результатам при использовании java.util.stream фреймворка.

Структурные помехи источнику можно управлять следующими способами (в приблизительном порядке убывания желательности):

  • Источник не может подвергаться структурным изменениям.
    Например, экземпляр CopyOnWriteArrayList является неизменяемым источником. Spliterator, созданный из источника, сообщает о характеристике IMMUTABLE.
  • Источник управляет одновременными изменениями.
    Например, множество ключей ConcurrentHashMap является конкурирующим источником. Spliterator, созданный из источника, сообщает о характеристике CONCURRENT.
  • Изменяемый источник предоставляет Spliterator с поздним связыванием и быстрым отказом.
    Позднее связывание сужает окно, в течение которого помехи могут повлиять на вычисление; быстрый отказ обнаруживает, с максимальной отдачей, что структурные помехи произошли после начала обхода и выбрасывает ConcurrentModificationException. Например, ArrayList и многие другие неконкурентные Collection классы в JDK предоставляют spliterator с поздним связыванием и быстрым отказом.
  • Изменяемый источник предоставляет Spliterator с несвоевременным связыванием, но с быстрым отказом.
    Источник увеличивает вероятность выбрасывания ConcurrentModificationException, так как окно потенциальных помех больше.
  • Изменяемый источник предоставляет Spliterator с поздним связыванием, но не с быстрым отказом.
    Источник подвергает опасности произвольное, недетерминированное поведение после начала обхода, так как помехи не обнаруживаются.
  • Изменяемый источник предоставляет Spliterator со своевременным связыванием и без быстрого отказа.
    Источник увеличивает риск произвольного, недетерминированного поведения, так как не обнаруженные помехи могут возникнуть после создания.

Пример. Вот класс (не очень полезный, кроме иллюстрации), который поддерживает массив, в котором фактические данные хранятся в чётных позициях, а не связанные тег-данные хранятся в нечётных позициях. Его Spliterator игнорирует теги.

 
 class TaggedArray<T> {
   private final Object[] elements; // immutable after construction
   TaggedArray(T[] data, Object[] tags) {
     int size = data.length;
     if (tags.length != size) throw new IllegalArgumentException();
     this.elements = new Object[2 * size];
     for (int i = 0, j = 0; i < size; ++i) {
       elements[j++] = data[i];
       elements[j++] = tags[i];
     }
   }

   public Spliterator<T> spliterator() {
     return new TaggedArraySpliterator<>(elements, 0, elements.length);
   }

   static class TaggedArraySpliterator<T> implements Spliterator<T> {
     private final Object[] array;
     private int origin; // current index, advanced on split or traversal
     private final int fence; // one past the greatest index

     TaggedArraySpliterator(Object[] array, int origin, int fence) {
       this.array = array; this.origin = origin; this.fence = fence;
     }

     public void forEachRemaining(Consumer<? super T> action) {
       for (; origin < fence; origin += 2)
         action.accept((T) array[origin]);
     }

     public boolean tryAdvance(Consumer<? super T> action) {
       if (origin < fence) {
         action.accept((T) array[origin]);
         origin += 2;
         return true;
       }
       else // cannot advance
         return false;
     }

     public Spliterator<T> trySplit() {
       int lo = origin; // divide range in half
       int mid = ((lo + fence) >>> 1) & ~1; // force midpoint to be even
       if (lo < mid) { // split out left half
         origin = mid; // reset this Spliterator's origin
         return new TaggedArraySpliterator<>(array, lo, mid);
       }
       else       // too small to split
         return null;
     }

     public long estimateSize() {
       return (long)((fence - origin) / 2);
     }

     public int characteristics() {
       return ORDERED | SIZED | IMMUTABLE | SUBSIZED;
     }
   }
 }

В качестве примера того, как фреймворк параллельных вычислений, такой как пакет java.util.stream, использовал бы Spliterator в параллельном вычислении, вот один способ реализации связанного параллельного forEach, который иллюстрирует основной стиль использования разбиения подзадач до тех пор, пока объём работы не станет достаточно малым для последовательного выполнения. Здесь мы предполагаем, что порядок обработки подзадач не имеет значения; различные (разветвлённые) задачи могут далее разбить и обработать элементы параллельно в неопределённом порядке. Этот пример использует CountedCompleter; аналогичные применения относятся к другим конструкциям параллельных задач.


 static <T> void parEach(TaggedArray<T> a, Consumer<T> action) {
   Spliterator<T> s = a.spliterator();
   long targetBatchSize = s.estimateSize() / (ForkJoinPool.getCommonPoolParallelism() * 8);
   new ParEach(null, s, action, targetBatchSize).invoke();
 }

 static class ParEach<T> extends CountedCompleter<Void> {
   final Spliterator<T> spliterator;
   final Consumer<T> action;
   final long targetBatchSize;

   ParEach(ParEach<T> parent, Spliterator<T> spliterator,
           Consumer<T> action, long targetBatchSize) {
     super(parent);
     this.spliterator = spliterator; this.action = action;
     this.targetBatchSize = targetBatchSize;
   }

   public void compute() {
     Spliterator<T> sub;
     while (spliterator.estimateSize() > targetBatchSize &&
            (sub = spliterator.trySplit()) != null) {
       addToPendingCount(1);
       new ParEach<>(this, sub, action, targetBatchSize).fork();
     }
     spliterator.forEachRemaining(action);
     propagateCompletion();
   }
 }
Замечание реализации:
Если системная переменная org.openjdk.java.util.stream.tripwire установлена в true, то выдаются диагностические предупреждения, если происходит упаковка примитивных значений при работе с примитивными специализациями подтипов.
С тех пор:
1.8
См. также:
  • Collection

Краткое описание вложенных классов

Модификатор и тип Интерфейс Описание
static interface  Spliterator.OfDouble
Специализированный Spliterator для значений double.
static interface  Spliterator.OfInt
Специализированный Spliterator для значений int.
static interface  Spliterator.OfLong
Специализированный Spliterator для значений long.
static interface  Spliterator.OfPrimitive<T, T_CONS, T_SPLITR extends Spliterator.OfPrimitive<T,T_CONS,T_SPLITR>>
Специализированный Spliterator для примитивных значений.

Краткое описание полей

Модификатор и тип Поле Описание
static final int CONCURRENT
Значение характеристики, обозначающее, что источник элементов может быть безопасно изменён одновременно (допускаются добавления, замены и/или удаления) несколькими потоками без внешней синхронизации.
static final int DISTINCT
Значение характеристики, обозначающее, что для каждой пары встреченных элементов x, y, !x.equals(y).
static final int IMMUTABLE
Значение характеристики, обозначающее, что источник элементов не может быть структурно изменён; то есть, элементы не могут быть добавлены, заменены или удалены, поэтому такие изменения не могут произойти во время обхода.
static final int NONNULL
Значение характеристики, обозначающее, что источник гарантирует, что встреченные элементы не будут null.
static final int ORDERED
Значение характеристики, обозначающее, что для элементов определён порядок встречи.
static final int SIZED
Значение характеристики, обозначающее, что значение, возвращаемое из estimateSize() перед обходом или разделением, представляет конечный размер, который, в отсутствие структурных изменений источника, представляет собой точное количество элементов, которые встретил бы полный обход.
static final int SORTED
Значение характеристики, обозначающее, что порядок встречи следует определённому порядку сортировки.
static final int SUBSIZED
Значение характеристики, обозначающее, что все Spliterators, полученные из trySplit(), будут и SIZED, и SUBSIZED.

Краткое описание методов

Модификатор и тип Метод Описание
int characteristics()
Возвращает набор характеристик этого Spliterator и его элементов.
long estimateSize()
Возвращает оценку количества элементов, которые встретит обход forEachRemaining(java.util.function.Consumer<? super T>), или возвращает Long.MAX_VALUE, если бесконечно, неизвестно или слишком дорого вычислить.
default void forEachRemaining(Consumer<? super T> action)
Выполняет заданное действие для каждого оставшегося элемента последовательно в текущем потоке, пока все элементы не будут обработаны или действие не выбросит исключение.
default Comparator<? super T> getComparator()
Если источник этого Spliterator SORTED по Comparator, возвращает этот Comparator.
default long getExactSizeIfKnown()
Удобный метод, возвращающий estimateSize(), если этот Spliterator SIZED, в противном случае -1.
default boolean hasCharacteristics(int characteristics)
Возвращает true, если характеристики этого Spliterator (characteristics()) содержат все заданные характеристики.
boolean tryAdvance(Consumer<? super T> action)
Если существует оставшийся элемент: выполняет заданное действие над ним, возвращая true; в противном случае возвращает false.
Spliterator<T> trySplit()
Если этот итератор может быть разбит, возвращает Spliterator, охватывающий элементы, которые после возвращения из этого метода не будут охвачены этим Spliterator.

Подробное описание полей

ORDERED

static final int ORDERED
Характеристическое значение, указывающее на то, что для элементов определён порядок обхода. В этом случае этот Spliterator гарантирует, что метод trySplit() разбивает строгий префикс элементов, метод tryAdvance(java.util.function.Consumer<? super T>) переходит к следующему элементу в порядке префикса, а forEachRemaining(java.util.function.Consumer<? super T>) выполняет действия в порядке обхода.

У Collection есть порядок обхода, если соответствующий Collection.iterator() документирует порядок. В таком случае порядок обхода совпадает с документированным порядком. В противном случае у коллекции нет порядка обхода.

Примечание API:
Порядок обхода гарантированно является возрастающим порядком индексов для любого List. Однако порядок не гарантируется для основанных на хешировании коллекций, таких как HashSet. Клиенты Spliterator, который сообщает ORDERED, должны сохранять ограничения порядка в некоммутативных параллельных вычислениях.
См. также:
  • Значения константных полей

DISTINCT

static final int DISTINCT
Характеристическое значение, указывающее на то, что для каждой пары встреченных элементов x, y, !x.equals(y). Это относится, например, к Spliterator, основанному на Set.
См. также:
  • Значения константных полей

SORTED

static final int SORTED
Характеристическое значение, указывающее на то, что порядок обхода следует определённому порядку сортировки. Если это так, метод getComparator() возвращает связанный Comparator или null, если все элементы являются Comparable и отсортированы по их естественному порядку.

Spliterator, сообщающий о SORTED, также должен сообщать о ORDERED.

Примечание API:
Spliterators для Collection классов в JDK, которые реализуют NavigableSet или SortedSet, сообщают о SORTED.
См. также:
  • Значения константных полей

SIZED

static final int SIZED
Характеристическое значение, указывающее на то, что значение, возвращаемое из estimateSize() до начала обхода или разбиения, представляет конечный размер, который в отсутствие структурных изменений источника представляет точное количество элементов, которые были бы встречены при полном обходе.
Примечание API:
Большинство Spliterator для коллекций, охватывающих все элементы коллекции, сообщают об этой характеристике. Под-Spliterators, такие как для HashSet, охватывающие подмножество элементов и приближающие свой размер, этого не делают.
См. также:
  • Значения константных полей

NONNULL

static final int NONNULL
Характеристическое значение, указывающее, что источник гарантирует, что встречаемые элементы не будут null. (Это относится, например, к большинству конкурентных коллекций, очередям и картам.)
См. также:
  • Значения константных полей

IMMUTABLE

static final int IMMUTABLE
Характеристическое значение, указывающее, что источник элементов не может быть структурно изменён; то есть элементы не могут быть добавлены, заменены или удалены, поэтому такие изменения не могут произойти во время обхода. Spliterator, который не сообщает о IMMUTABLE или CONCURRENT, должен иметь документированную политику (например, выбрасывать ConcurrentModificationException) относительно структурных конфликтов, обнаруженных во время обхода.
См. также:
  • Значения константных полей

CONCURRENT

static final int CONCURRENT
Характеристическое значение, указывающее, что источник элементов может быть безопасно изменён одновременно (позволяя добавлять, заменять и/или удалять) несколькими потоками без внешней синхронизации. Если это так, Spliterator должен иметь документированную политику относительно влияния изменений во время обхода.

Уровневый Spliterator не должен сообщать как о CONCURRENT, так и о SIZED, так как конечный размер, если он известен, может измениться, если источник одновременно изменяется во время обхода. Такой Spliterator несогласован, и никакие гарантии не могут быть даны относительно любых вычислений, использующих этот Spliterator. Под-spliterators могут сообщать о SIZED, если размер под-разбиения известен, а добавления или удаления в источнике не отражаются во время обхода.

Уровневый Spliterator не должен сообщать как о CONCURRENT, так и о IMMUTABLE, так как они взаимоисключают друг друга. Такой Spliterator несогласован, и никакие гарантии не могут быть даны относительно любых вычислений, использующих этот Spliterator. Под-spliterators могут сообщать о IMMUTABLE, если добавления или удаления в источнике не отражаются во время обхода.

Примечание API:
Большинство конкурентных коллекций поддерживают политику согласованности, гарантирующую точность в отношении элементов, присутствующих в момент создания Spliterator, но, возможно, не отражающих последующие добавления или удаления.
См. также:
  • Значения константных полей

SUBSIZED

static final int SUBSIZED
Характеристическое значение, означающее, что все Spliterators, полученные в результате trySplit(), будут и SIZED, и SUBSIZED. (Это означает, что все дочерние Spliterators, прямые или косвенные, будут SIZED.)

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

Примечание API:
Некоторые Spliterators, такие как главный Spliterator для примерно сбалансированного двоичного дерева, сообщают о SIZED, но не о SUBSIZED, поскольку часто известно количество элементов в целом дереве, но не точные размеры поддеревьев.
См. также:
  • Значения константных полей

Подробное описание методов

tryAdvance

boolean tryAdvance(Consumer<? super T> action)
Если существует оставшийся элемент: выполняет заданное действие над ним, возвращая true; в противном случае возвращает false. Если этот Spliterator является ORDERED, действие выполняется над следующим элементом в порядке обхода. Исключение, брошенное действием, передаётся вызывающей стороне.

Поведение Spliterator после выбрасывания исключения не определено.

Параметры:
action - Действие, выполняемое максимум один раз
Возвращает:
false, если при входе в этот метод не существовало оставшихся элементов, иначе true.
Исключения:
NullPointerException - если указанное действие равно null

forEachRemaining

default void forEachRemaining(Consumer<? super T> action)
Выполняет заданное действие для каждого оставшегося элемента последовательно в текущем потоке, до обработки всех элементов или выбрасывания исключения действием. Если этот Spliterator является ORDERED, действия выполняются в порядке обхода. Исключение, брошенное действием, передаётся вызывающей стороне.

Поведение Spliterator после выбрасывания исключения не определено.

Требования к реализации:
По умолчанию реализация многократно вызывает tryAdvance(java.util.function.Consumer<? super T>) до тех пор, пока она не вернёт false. Его следует переопределять всякий раз, когда это возможно.
Параметры:
action - Действие
Исключения:
NullPointerException - если указанное действие равно null

trySplit

Spliterator<T> trySplit()
Если этот разделяемый итератор может быть разделен, возвращает разделяемый итератор, охватывающий элементы, которые после возврата из этого метода не будут охватываться этим разделяемым итератором.

Если этот разделяемый итератор ORDERED, возвращаемый разделяемый итератор должен охватывать строгий префикс элементов.

Если этот разделяемый итератор не охватывает бесконечное количество элементов, повторные вызовы к trySplit() должны в конечном итоге вернуть null. При возвращении значения отличного от null:

  • значение, возвращаемое для estimateSize() до разделения, должно после разделения быть больше или равно estimateSize() для этого и возвращенного разделяемого итератора; и
  • если этот разделяемый итератор является SUBSIZED, то estimateSize() для этого разделяемого итератора до разделения должен быть равен сумме estimateSize() для этого и возвращенного разделяемого итератора после разделения.

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

Примечание API:
Идеальный метод trySplit эффективно (без обхода) делит свои элементы ровно пополам, что позволяет сбалансированное параллельное вычисление. Многие отклонения от этого идеала остаются высокоэффективными; например, приблизительное разделение приблизительно сбалансированного дерева или для дерева, в котором узлы листьев могут содержать либо один, либо два элемента, не разделяя эти узлы дополнительно. Однако большие отклонения в балансе и/или чрезмерно неэффективные механизмы trySplit обычно приводят к плохой параллельной производительности.
Возвращает:
разделяемый итератор, охватывающий часть элементов, или null, если этот разделяемый итератор не может быть разделен

estimateSize

long estimateSize()
Возвращает оценку числа элементов, которые были бы встречены при обходе forEachRemaining(java.util.function.Consumer<? super T>), или возвращает Long.MAX_VALUE, если бесконечно, неизвестно или слишком дорого вычисляется.

Если этот разделяемый итератор SIZED и еще не был частично пройден или разделен, или этот разделяемый итератор SUBSIZED и еще не был частично пройден, эта оценка должна быть точным количеством элементов, которые были бы встречены при полном обходе. В противном случае эта оценка может быть произвольно неточной, но должна уменьшаться, как указано при вызовах trySplit().

Примечание API:
Даже неточная оценка часто полезна и недорога для вычисления. Например, под-разделяемый итератор приблизительно сбалансированного бинарного дерева может вернуть значение, которое оценивает количество элементов как половину от количества элементов в родительском; если корневой разделяемый итератор не поддерживает точное подсчет, он может оценить размер как степень двойки, соответствующую его максимальной глубине.
Возвращает:
оцененный размер или Long.MAX_VALUE, если бесконечно, неизвестно или слишком дорого вычисляется.

getExactSizeIfKnown

default long getExactSizeIfKnown()
Удобный метод, который возвращает estimateSize(), если этот разделяемый итератор SIZED, иначе -1.
Требования к реализации:
Стандартная реализация возвращает результат estimateSize(), если разделяемый итератор сообщает о характеристике SIZED, и -1 в противном случае.
Возвращает:
точный размер, если известен, иначе -1.

characteristics

int characteristics()
Возвращает набор характеристик этого разделяемого итератора и его элементов. Результат представляется как значения, связанные операцией побитового ИЛИ из ORDERED, DISTINCT, SORTED, SIZED, NONNULL, IMMUTABLE, CONCURRENT, SUBSIZED. Повторные вызовы к characteristics() для данного разделяемого итератора до или между вызовами к trySplit должны всегда возвращать один и тот же результат.

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

Примечание API:
Характеристики данного разделяемого итератора до разделения могут отличаться от характеристик после разделения. Для конкретных примеров см. значения характеристик SIZED, SUBSIZED и CONCURRENT.
Возвращает:
представление характеристик

hasCharacteristics

default boolean hasCharacteristics(int characteristics)
Возвращает true, если характеристики этого разделяемого итератора characteristics() содержат все заданные характеристики.
Требования к реализации:
Стандартная реализация возвращает true, если соответствующие биты заданных характеристик установлены.
Параметры:
characteristics - проверяемые характеристики
Возвращает:
true, если все указанные характеристики присутствуют, иначе false

getComparator

default Comparator<? super T> getComparator()
Если источник этого разделяемого итератора SORTED с помощью Comparator, возвращает этот Comparator. Если источник сортируется в порядке естественного порядка SORTED, возвращает null. В противном случае, если источник не является SORTED, выбрасывает IllegalStateException.
Требования к реализации:
Стандартная реализация всегда выбрасывает IllegalStateException.
Возвращает:
Comparator или null, если элементы отсортированы в естественном порядке.
Исключения:
IllegalStateException - если разделяемый итератор не сообщает о характеристике SORTED.

© 1993, 2025, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
https://download.java.net/java/early_access/jdk24/docs/api/java.base/java/util/Spliterator.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API