Интерфейс Collection<E>
- Параметры типа:
E- тип элементов в этом наборе
- Все суперинтерфейсы:
Iterable<E>
- Все известные подинтерфейсы:
-
BeanContext,BeanContextServices,BlockingDeque<E>,BlockingQueue<E>,Deque<E>,EventSet,List<E>,NavigableSet<E>,Queue<E>,SequencedCollection<E>,SequencedSet<E>,Set<E>,SortedSet<E>,TransferQueue<E>
- Все известные реализующие классы:
-
AbstractCollection,AbstractList,AbstractQueue,AbstractSequentialList,AbstractSet,ArrayBlockingQueue,ArrayDeque,ArrayList,AttributeList,BeanContextServicesSupport,BeanContextSupport,ConcurrentHashMap.KeySetView,ConcurrentLinkedDeque,ConcurrentLinkedQueue,ConcurrentSkipListSet,CopyOnWriteArrayList,CopyOnWriteArraySet,DelayQueue,EnumSet,HashSet,JobStateReasons,LinkedBlockingDeque,LinkedBlockingQueue,LinkedHashSet,LinkedList,LinkedTransferQueue,PriorityBlockingQueue,PriorityQueue,RoleList,RoleUnresolvedList,Stack,SynchronousQueue,TreeSet,Vector
public interface Collection<E> extends Iterable<E>
SequencedCollection. JDK не предоставляет непосредственных реализаций этого интерфейса: он предоставляет реализации более конкретных подинтерфейсов, таких как Set и List. Этот интерфейс обычно используется для передачи и манипулирования коллекциями, где требуется максимальная общность. Множества или мультимножества (неупорядоченные коллекции, которые могут содержать дублирующиеся элементы) должны реализовывать этот интерфейс непосредственно.
Все общие реализации Collection (которые обычно реализуют Collection косвенно через один из его подинтерфейсов) должны предоставлять два «стандартных» конструктора: конструктор без аргументов, который создаёт пустую коллекцию, и конструктор с одним аргументом типа Collection, который создаёт новую коллекцию с теми же элементами, что и её аргумент. По сути, последний конструктор позволяет пользователю копировать любую коллекцию, создавая эквивалентную коллекцию нужного типа реализации. Нет способа принудительно следовать этой конвенции (так как интерфейсы не могут содержать конструкторы), но все общие реализации Collection в библиотеках Java платформы соответствуют ей.
Некоторые методы определены как необязательные. Если реализация коллекции не реализует определённую операцию, она должна определить соответствующий метод, чтобы тот бросал исключение UnsupportedOperationException. Такие методы в спецификациях методов интерфейсов коллекций помечены как «необязательная операция».
Некоторые реализации коллекций имеют ограничения на элементы, которые они могут содержать. Например, некоторые реализации запрещают null-элементы, а некоторые имеют ограничения на типы элементов. Попытка добавить неподходящий элемент вызывает необработанное исключение, обычно NullPointerException или ClassCastException. Попытка запросить наличие неподходящего элемента может вызвать исключение или просто вернуть false; некоторые реализации будут демонстрировать первое поведение, а некоторые — второе. Более обобщённо, попытка операции с неподходящим элементом, выполнение которой не приведёт к вставке неподходящего элемента в коллекцию, может вызвать исключение или завершиться успешно, по выбору реализации. Такие исключения помечены как «необязательные» в спецификации для этого интерфейса.
Каждая коллекция сама определяет свою политику синхронизации. При отсутствии более сильного гарантии от реализации, вызов любого метода на коллекции, которая изменяется другим потоком, может привести к неопределённому поведению; это включает прямые вызовы, передачу коллекции методу, который может выполнить вызовы, и использование существующего итератора для просмотра коллекции.
Многие методы в интерфейсах Collections Framework определены с точки зрения метода equals. Например, спецификация метода contains(Object o) гласит: «возвращает true тогда и только тогда, когда эта коллекция содержит по крайней мере один элемент e такой, что (o==null ? e==null : o.equals(e))». Эта спецификация не должна интерпретироваться как импликация, что вызов Collection.contains с ненулевым аргументом o вызовет o.equals(e) для любого элемента e. Реализации могут свободно использовать оптимизации, в которых вызов equals избегается, например, сравнивая сначала хеш-коды двух элементов. (Спецификация Object.hashCode() гарантирует, что два объекта с неравными хеш-кодами не могут быть равны.) Более обобщённо, реализации различных интерфейсов Collections Framework свободно могут воспользоваться указанным поведением базовых методов Object там, где реализатор считает это уместным.
Некоторые операции с коллекциями, которые выполняют рекурсивную обработку коллекции, могут завершиться исключением для самоссылочных экземпляров, где коллекция непосредственно или косвенно содержит себя. Это включает методы clone(), equals(), hashCode() и toString(). Реализации могут по желанию обрабатывать самоссылочный сценарий, однако большинство текущих реализаций этого не делают.
Коллекции-представления
Большинство коллекций управляют хранилищем элементов, которые они содержат. В отличие от этого, коллекции-представления сами не хранят элементы, а вместо этого опираются на базовую коллекцию для хранения фактических элементов. Операции, которые не обрабатываются коллекцией-представлением, делегируются базовой коллекции. Примеры коллекций-представлений включают обертки коллекций, возвращаемые методами, такими как Collections.checkedCollection, Collections.synchronizedCollection и Collections.unmodifiableCollection. Другие примеры коллекций-представлений включают коллекции, которые предоставляют другое представление тех же элементов, например, как предоставляется методами List.subList, NavigableSet.subSet, Map.entrySet или SequencedCollection.reversed. Любые изменения, внесённые в базовую коллекцию, видны в коллекции-представлении. Соответственно, любые изменения, внесённые в коллекцию-представление (если изменения разрешены), записываются в базовую коллекцию. Хотя они технически не являются коллекциями, экземпляры Iterator и ListIterator также могут позволить запись изменений в базовую коллекцию, и в некоторых случаях изменения в базовой коллекции будут видны итератору во время итерации.
Неизменяемые коллекции
Некоторые методы этого интерфейса считаются «разрушающими» и называются «методами-мутаторами», так как они изменяют группу объектов, содержащихся в коллекции, над которой они работают. Они могут быть определены так, чтобы бросать UnsupportedOperationException, если реализация этой коллекции не поддерживает операцию. Такие методы должны (но не обязаны) бросать UnsupportedOperationException, если вызов не окажет никакого влияния на коллекцию. Например, рассмотрим коллекцию, которая не поддерживает операцию add. Что произойдёт, если метод addAll будет вызван для этой коллекции с пустой коллекцией в качестве аргумента? Добавление нуля элементов не оказывает влияния, поэтому разрешено, чтобы эта коллекция просто ничего не делала и не выбрасывала исключение. Тем не менее, рекомендуется, чтобы в таких случаях исключение выбрасывалось безоговорочно, так как выбрасывание только в определённых случаях может привести к ошибкам программирования.
Неизменяемая коллекция — это коллекция, все методы-мутаторы которой (как определено выше) определены так, чтобы бросать UnsupportedOperationException. Таким образом, такая коллекция не может быть изменена путём вызова методов на ней. Для того, чтобы коллекция была должным образом неизменяемой, все коллекции-представления, производные от неё, также должны быть неизменяемыми. Например, если список неизменяем, список, возвращаемый List.subList, также неизменяем.
Неизменяемая коллекция не обязательно является неизменяемой в строгом смысле. Если содержащиеся элементы изменяемы, вся коллекция явно изменяема, даже если она может быть неизменяемой. Например, рассмотрим два неизменяемых списка, содержащих изменяемые элементы. Результат вызова list1.equals(list2) может отличаться от одного вызова к другому, если элементы были изменены, даже если оба списка неизменяемы. Однако, если неизменяемая коллекция содержит только неизменяемые элементы, она может считаться эффективно неизменяемой.
Неизменяемые коллекции-представления
Неизменяемая коллекция-представление — это коллекция, которая неизменяема и также является представлением базовой коллекции. Её методы-мутаторы бросают UnsupportedOperationException, как описано выше, в то время как методы чтения и запроса делегируются базовой коллекции. Это позволяет обеспечить только чтение базовой коллекции. Это полезно, если компоненту нужно предоставить пользователям доступ для чтения к внутренней коллекции, одновременно предотвращая неожиданное изменение таких коллекций. Примеры неизменяемых коллекций-представлений — это те, которые возвращаются методами Collections.unmodifiableCollection, Collections.unmodifiableList и подобными.
Обратите внимание, что изменения в базовой коллекции всё ещё возможны, и если они произойдут, они будут видны через неизменяемое представление. Таким образом, неизменяемая коллекция-представление не обязательно является неизменяемой в строгом смысле. Однако, если базовая коллекция неизменяемой коллекции-представления фактически неизменяема, или если единственная ссылка на базовую коллекцию — через неизменяемое представление, то представление можно считать фактически неизменяемым.
Сериализация коллекций
Сериализация коллекций — необязательна. Поэтому ни один из интерфейсов коллекций не объявлен реализующим интерфейс Serializable. Однако, сериализация считается полезной, поэтому большинство реализаций коллекций сериализуемы.
Реализации коллекций, которые являются общедоступными классами (такими как ArrayList или HashMap), объявлены реализующими интерфейс Serializable, если они действительно сериализуемы. Некоторые реализации коллекций не являются общедоступными классами, например, неизменяемые коллекции. В таких случаях сериализация таких коллекций описывается в спецификации метода, который их создаёт, или в другом подходящем месте. В случаях, когда сериализация коллекции не указана, нет гарантий о сериализации таких коллекций. В частности, многие коллекции-представления не сериализуемы, даже если исходная коллекция сериализуема.
Реализация коллекции, которая реализует интерфейс Serializable, не гарантируется как сериализуемая. Причина в том, что в общем случае коллекции содержат элементы других типов, и статически невозможно определить, являются ли экземпляры какого-либо типа элементов фактически сериализуемыми. Например, рассмотрим сериализуемую Collection<E>, где E не реализует интерфейс Serializable. Коллекция может быть сериализуемой, если она содержит только элементы некоторого сериализуемого подтипа E или если она пуста. Следовательно, коллекции называются условно сериализуемыми, так как сериализуемость коллекции в целом зависит от того, является ли сама коллекция сериализуемой и от того, являются ли все содержащиеся элементы также сериализуемыми.
Дополнительный случай возникает с экземплярами SortedSet и SortedMap. Эти коллекции можно создать с помощью Comparator, который задаёт порядок элементов множества или ключей отображения. Такая коллекция сериализуема только в том случае, если предоставленный Comparator также сериализуем.
Этот интерфейс является членом Java Collections Framework.
- Требования к реализации:
- Реализации по умолчанию (унаследованные или иные) не применяют никакого протокола синхронизации. Если реализация
Collectionимеет определённый протокол синхронизации, то она должна переопределить реализации по умолчанию, чтобы применить этот протокол. - С:
- 1.2
- См. также:
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
boolean |
add |
Обеспечивает, что эта коллекция содержит указанный элемент (необязательная операция). |
boolean |
addAll |
Добавляет все элементы из указанной коллекции в эту коллекцию (необязательная операция). |
void |
clear() |
Удаляет все элементы из этой коллекции (необязательная операция). |
boolean |
contains |
Возвращает true, если эта коллекция содержит указанный элемент. |
boolean |
containsAll |
Возвращает true, если эта коллекция содержит все элементы указанной коллекции. |
boolean |
equals |
Сравнивает указанный объект с этой коллекцией на предмет равенства. |
int |
hashCode() |
Возвращает хэш-код для этой коллекции. |
boolean |
isEmpty() |
Возвращает true, если эта коллекция не содержит элементов. |
Iterator |
iterator() |
Возвращает итератор по элементам в этой коллекции. |
default Stream |
parallelStream() |
Возвращает, возможно, параллельный Stream с этой коллекцией в качестве источника. |
boolean |
remove |
Удаляет один экземпляр указанного элемента из этой коллекции, если он присутствует (необязательная операция). |
boolean |
removeAll |
Удаляет все элементы этой коллекции, которые также содержатся в указанной коллекции (необязательная операция). |
default boolean |
removeIf |
Удаляет все элементы этой коллекции, удовлетворяющие заданному предикату (необязательная операция). |
boolean |
retainAll |
Сохраняет только элементы в этой коллекции, которые содержатся в указанной коллекции (необязательная операция). |
int |
size() |
Возвращает количество элементов в этой коллекции. |
default Spliterator |
spliterator() |
Создаёт Spliterator над элементами в этой коллекции. |
default Stream |
stream() |
Возвращает последовательный Stream с этой коллекцией в качестве источника. |
Object[] |
toArray() |
Возвращает массив, содержащий все элементы в этой коллекции. |
default <T> T[] |
toArray |
Возвращает массив, содержащий все элементы в этой коллекции, используя предоставленную функцию generator для выделения возвращаемого массива. |
<T> T[] |
toArray |
Возвращает массив, содержащий все элементы в этой коллекции; тип времени выполнения возвращаемого массива — тип указанного массива. |
Подробности методов
size
int size()
Integer.MAX_VALUE элементов, возвращает Integer.MAX_VALUE.- Возвращает:
- количество элементов в этом наборе
isEmpty
boolean isEmpty()
true, если этот набор не содержит элементов.- Возвращает:
-
true, если этот набор не содержит элементов
contains
boolean contains(Object o)
true, если этот набор содержит указанный элемент. Более формально, возвращает true тогда и только тогда, когда этот набор содержит по крайней мере один элемент e, такой что Objects.equals(o, e).- Параметры:
-
o- элемент, присутствие которого в этом наборе необходимо проверить - Возвращает:
-
true, если этот набор содержит указанный элемент - Исключения:
-
ClassCastException- если тип указанного элемента несовместим с этим набором (необязательно) -
NullPointerException- если указанный элемент имеет значение null, а этот набор не допускает null-элементы (необязательно)
iterator
Iterator<E> iterator()
toArray
Object[] toArray()
Object. Возвращаемый массив является «безопасным» в том смысле, что к нему не сохраняются ссылки этим набором. (Другими словами, этот метод должен выделить новый массив, даже если этот набор поддерживается массивом). Таким образом, вызывающая сторона свободна изменять возвращаемый массив.
- Примечание API:
- Этот метод действует как мост между основанными на массиве и основанными на наборе API. Он возвращает массив, тип компонента которого —
Object[]. ИспользуйтеtoArray(T[])для повторного использования существующего массива илиtoArray(IntFunction)для управления типом массива. - Возвращает:
- массив, тип компонента которого —
Object, содержащий все элементы этого набора
toArray
<T> T[] toArray(T[] a)
Если этот набор помещается в указанный массив с избыточным объемом (т. е. массив имеет больше элементов, чем этот набор), элемент в массиве непосредственно после конца набора устанавливается в null. (Это полезно для определения длины этого набора *только* если вызывающая сторона знает, что этот набор не содержит никаких null элементов.)
Если этот набор гарантирует порядок, в котором его элементы возвращаются итератором, этот метод должен возвращать элементы в том же порядке.
- Примечание API:
- Этот метод действует как мост между основанными на массиве и основанными на наборе API. Он позволяет повторно использовать существующий массив в определенных случаях. Используйте
toArray()для создания массива, тип выполнения которого —Object[], илиtoArray(IntFunction)для управления типом массива.Предположим, что
x— это набор, известный тем, что содержит только строки. Следующий код может быть использован для выгрузки набора в ранее выделенный массивString:String[] y = new String[SIZE]; ... y = x.toArray(y);Значение возврата переприсваивается переменной
y, потому что будет выделен и возвращен новый массив, если наборxсодержит слишком много элементов, чтобы поместиться в существующий массивy.Обратите внимание, что
toArray(new Object[0])идентичен по функцииtoArray(). - Параметры типа:
T- тип компонента массива, содержащего набор- Параметры:
-
a- массив, в который должны быть помещены элементы этого набора, если он достаточно большой; в противном случае для этой цели выделяется новый массив того же типа выполнения. - Возвращает:
- массив, содержащий все элементы этого набора
- Исключения:
-
ArrayStoreException- если тип выполнения любого элемента в этом наборе не может быть присвоен типу компонента выполнения указанного массива -
NullPointerException- если указанный массив имеет значение null
toArray
default <T> T[] toArray(IntFunction<T[]> generator)
generator для выделения возвращаемого массива. Если этот набор гарантирует порядок, в котором его элементы возвращаются итератором, этот метод должен возвращать элементы в том же порядке.
- Примечание API:
- Этот метод действует как мост между основанными на массиве и основанными на наборе API. Он позволяет создавать массив определенного типа выполнения. Используйте
toArray()для создания массива, тип выполнения которого —Object[], илиtoArray(T[])для повторного использования существующего массива.Предположим, что
x— это набор, известный тем, что содержит только строки. Следующий код можно использовать для выгрузки набора в новый массивString:String[] y = x.toArray(String[]::new); - Требования к реализации:
- Базовая реализация вызывает функцию генератора с нулем, а затем передает полученный массив методу
toArray(T[]). - Параметры типа:
T- тип компонента массива, содержащего набор- Параметры:
-
generator- функция, которая создает новый массив нужного типа и заданного размера - Возвращает:
- массив, содержащий все элементы этого набора
- Исключения:
-
ArrayStoreException- если тип выполнения любого элемента в этом наборе не может быть присвоен типу компонента выполнения созданного массива -
NullPointerException- если функция генератора имеет значение null - С:
- 11
add
boolean add(E e)
true, если этот набор изменился в результате вызова. (Возвращает false, если этот набор не допускает дубликатов и уже содержит указанный элемент.) Наборы, поддерживающие эту операцию, могут накладывать ограничения на то, какие элементы могут быть добавлены в этот набор. В частности, некоторые наборы откажутся добавлять null элементы, а другие наложат ограничения на тип добавляемых элементов. Классы наборов должны четко указывать в своей документации любые ограничения на добавляемые элементы.
Если набор отказывается добавлять конкретный элемент по любой причине, кроме того, что он уже содержит этот элемент, он *должен* выбросить исключение (а не вернуть false). Это сохраняет инвариант, что набор всегда содержит указанный элемент после возврата из этого вызова.
- Параметры:
-
e- элемент, присутствие которого в этом наборе необходимо обеспечить - Возвращает:
-
true, если этот набор изменился в результате вызова - Исключения:
-
UnsupportedOperationException- если операцияaddне поддерживается этим набором -
ClassCastException- если класс указанного элемента не позволяет добавить его в этот набор -
NullPointerException- если указанный элемент имеет значение null, а этот набор не допускает null-элементы -
IllegalArgumentException- если какое-либо свойство элемента препятствует его добавлению в этот набор -
IllegalStateException- если элемент не может быть добавлен в данный момент из-за ограничений вставки
remove
boolean remove(Object o)
e такой, что Objects.equals(o, e), если эта коллекция содержит один или более таких элементов. Возвращает true, если эта коллекция содержала указанный элемент (или эквивалентно, если эта коллекция изменилась в результате вызова).- Параметры:
-
o- элемент, который необходимо удалить из этой коллекции, если он присутствует - Возвращает:
-
true, если элемент был удален в результате этого вызова - Исключения:
-
ClassCastException- если тип указанного элемента несовместим с этой коллекцией (необязательно) -
NullPointerException- если указанный элемент равен null, и эта коллекция не допускает элементов null (необязательно) -
UnsupportedOperationException- еслиremoveоперация не поддерживается этой коллекцией
containsAll
boolean containsAll(Collection<?> c)
true, если эта коллекция содержит все элементы в указанной коллекции.- Параметры:
-
c- коллекция, которую необходимо проверить на наличие в этой коллекции - Возвращает:
-
true, если эта коллекция содержит все элементы указанной коллекции - Исключения:
-
ClassCastException- если типы одного или нескольких элементов в указанной коллекции несовместимы с этой коллекцией (необязательно) -
NullPointerException- если указанная коллекция содержит один или несколько элементов null, и эта коллекция не допускает элементов null (необязательно) или если указанная коллекция равна null. - См. также:
addAll
boolean addAll(Collection<? extends E> c)
- Параметры:
-
c- коллекция, содержащая элементы, которые необходимо добавить в эту коллекцию - Возвращает:
-
true, если эта коллекция изменилась в результате вызова - Исключения:
-
UnsupportedOperationException- еслиaddAllоперация не поддерживается этой коллекцией -
ClassCastException- если класс элемента указанной коллекции препятствует его добавлению в эту коллекцию -
NullPointerException- если указанная коллекция содержит элемент null, и эта коллекция не допускает элементов null, или если указанная коллекция равна null -
IllegalArgumentException- если какое-либо свойство элемента указанной коллекции препятствует его добавлению в эту коллекцию -
IllegalStateException- если не все элементы могут быть добавлены в данный момент из-за ограничений вставки - См. также:
removeAll
boolean removeAll(Collection<?> c)
- Параметры:
-
c- коллекция, содержащая элементы, которые необходимо удалить из этой коллекции - Возвращает:
-
true, если эта коллекция изменилась в результате вызова - Исключения:
-
UnsupportedOperationException- еслиremoveAllоперация не поддерживается этой коллекцией -
ClassCastException- если типы одного или нескольких элементов в этой коллекции несовместимы с указанной коллекцией (необязательно) -
NullPointerException- если эта коллекция содержит один или несколько элементов null, и указанная коллекция не поддерживает элементы null (необязательно) или если указанная коллекция равна null - См. также:
removeIf
default boolean removeIf(Predicate<? super E> filter)
- Требования к реализации:
- Реализация по умолчанию проходит по всем элементам коллекции, используя её
iterator(). Каждый совпадающий элемент удаляется с помощьюIterator.remove(). Если итератор коллекции не поддерживает удаление, то для первого совпадающего элемента будет выброшеноUnsupportedOperationException. - Параметры:
-
filter- предикат, который возвращаетtrueдля элементов, которые необходимо удалить - Возвращает:
-
true, если были удалены какие-либо элементы - Исключения:
-
NullPointerException- если указанный фильтр равен null -
UnsupportedOperationException- еслиremoveIfоперация не поддерживается этой коллекцией - С версии:
- 1.8
retainAll
boolean retainAll(Collection<?> c)
- Параметры:
-
c- коллекция, содержащая элементы, которые необходимо сохранить в этой коллекции - Возвращает:
-
true, если эта коллекция изменилась в результате вызова - Исключения:
-
UnsupportedOperationException- еслиretainAllоперация не поддерживается этой коллекцией -
ClassCastException- если типы одного или нескольких элементов в этой коллекции несовместимы с указанной коллекцией (необязательно) -
NullPointerException- если эта коллекция содержит один или несколько элементов null, и указанная коллекция не допускает элементов null (необязательно) или если указанная коллекция равна null - См. также:
clear
void clear()
- Исключения:
-
UnsupportedOperationException- еслиclearоперация не поддерживается этой коллекцией
equals
boolean equals(Object o)
Хотя интерфейс Collection не добавляет никаких условий к общему контракту для Object.equals, программисты, которые реализуют интерфейс Collection "непосредственно" (другими словами, создают класс, который является Collection, но не является Set или List), должны соблюдать осторожность, если они решат переопределить Object.equals. Делать это не обязательно, и самый простой вариант - полагаться на реализацию Object, но разработчик может пожелать реализовать "сравнение по значению" вместо стандартного "сравнения по ссылке". (Интерфейсы List и Set предписывают такие сравнения по значению.)
Общий контракт для метода Object.equals гласит, что equals должен быть симметричным (другими словами, a.equals(b) если и только если b.equals(a)). Контракты для List.equals и Set.equals гласят, что списки равны только другим спискам, а множества - другим множествам. Таким образом, настраиваемый метод equals для класса коллекций, который не реализует ни интерфейс List, ни Set, должен возвращать false, когда эта коллекция сравнивается с любым списком или множеством. (По той же логике невозможно написать класс, который правильно реализует как интерфейс Set, так и List.)
hashCode
int hashCode()
Collection не добавляет ограничений к общему контракту для метода Object.hashCode, программисты должны отметить, что любой класс, переопределяющий метод Object.equals, также должен переопределить метод Object.hashCode для удовлетворения общего контракта для метода Object.hashCode. В частности, c1.equals(c2) подразумевает, что c1.hashCode()==c2.hashCode().spliterator
default Spliterator<E> spliterator()
Spliterator над элементами в этом наборе. Реализации должны документировать значения характеристик, сообщённые этим разделителем. Такие значения характеристик необязательно сообщать, если разделитель сообщает о Spliterator.SIZED, и этот набор не содержит элементов. По умолчанию реализация должна быть переопределена подклассами, которые могут вернуть более эффективный разделитель. Для сохранения ожидаемого ленивого поведения методов stream() и parallelStream(), разделители должны иметь характеристику IMMUTABLE или CONCURRENT, или быть с опозданием связывающим. Если ни один из этих вариантов не практичен, переопределяющий класс должен описать документированную политику привязки и структурного вмешательства разделителя и должен переопределить методы stream() и parallelStream() для создания потоков с использованием Supplier разделителя, как в примере:
Stream<E> s = StreamSupport.stream(() -> spliterator(), spliteratorCharacteristics)
Эти требования гарантируют, что потоки, созданные методами stream() и parallelStream(), будут отражать содержимое набора на момент инициирования терминальной операции потока.
- Specified by:
-
spliteratorв интерфейсеIterable<E> - Implementation Requirements:
- По умолчанию реализация создаёт с опозданием связывающий разделитель из
Iteratorнабора. Разделитель наследует свойства быстрого отказа итератора набора.Созданный
Spliteratorсообщает оSpliterator.SIZED. - Implementation Note:
- Созданный
Spliteratorдополнительно сообщает оSpliterator.SUBSIZED.Если разделитель не охватывает никаких элементов, то передача дополнительных значений характеристик, помимо
SIZEDиSUBSIZED, не помогает клиентам управлять, специализировать или упрощать вычисления. Однако это позволяет использовать общий неизменяемый и пустой экземпляр разделителя (см.Spliterators.emptySpliterator()) для пустых наборов, и позволяет клиентам определить, охватывает ли такой разделитель какие-либо элементы. - Возвращает:
Spliteratorнад элементами в этом наборе- Since:
- 1.8
stream
default Stream<E> stream()
Stream с этим набором в качестве источника. Этот метод следует переопределять, когда метод spliterator() не может вернуть разделитель, который является IMMUTABLE, CONCURRENT или с опозданием связывающим. (См. spliterator() для получения подробностей.)
- Implementation Requirements:
- По умолчанию реализация создаёт последовательный
StreamизSpliteratorнабора. - Возвращает:
- последовательный
Streamнад элементами в этом наборе - Since:
- 1.8
parallelStream
default Stream<E> parallelStream()
Stream с этим набором в качестве источника. Допускается, что этот метод вернёт последовательный поток. Этот метод следует переопределять, когда метод spliterator() не может вернуть разделитель, который является IMMUTABLE, CONCURRENT или с опозданием связывающим. (См. spliterator() для получения подробностей.)
- Implementation Requirements:
- По умолчанию реализация создаёт параллельный
StreamизSpliteratorнабора. - Возвращает:
- возможно, параллельный
Streamнад элементами в этом наборе - Since:
- 1.8
© 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/Collection.html