Интерфейс 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 немодифицируем, List, возвращаемый методом 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 на основе массивов и API на основе коллекций. Он возвращает массив, тип которого во время выполнения —
Object[]. Для повторного использования существующего массива используйтеtoArray(T[]), а для управления типом массива во время выполнения используйтеtoArray(IntFunction). - Возвращает:
- массив с типом компонента во время выполнения
Object, содержащий все элементы этой коллекции
toArray
<T> T[] toArray(T[] a)
Если эта коллекция помещается в указанный массив с запасом (то есть массив содержит больше элементов, чем эта коллекция), элемент массива, следующий непосредственно за концом коллекции, устанавливается в null. (Это полезно для определения длины этой коллекции только в том случае, если вызывающий код знает, что эта коллекция не содержит элементов null.)
Если эта коллекция гарантирует определенный порядок возврата элементов итератором, этот метод должен возвращать элементы в том же порядке.
- Примечание к API:
- Этот метод служит связующим звеном между 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 на основе массивов и 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(), будут отражать содержимое коллекции на момент начала терминальной операции потока.
- Определено в:
-
spliteratorв интерфейсеIterable<E> - Требования к реализации:
- Реализация по умолчанию создает связываемый с задержкой сплитератор на основе
Iteratorколлекции. Сплитератор наследует свойства итератора коллекции, связанные с быстрым обнаружением изменений.Созданный
SpliteratorсообщаетSpliterator.SIZED. - Примечание по реализации:
- Созданный
Spliteratorдополнительно сообщаетSpliterator.SUBSIZED.Если сплитератор не охватывает ни одного элемента, сообщение дополнительных характеристик помимо
SIZEDиSUBSIZEDне помогает клиентам управлять вычислениями, специализировать их или упрощать. Однако это позволяет совместно использовать неизменяемый пустой экземпляр сплитератора (см.Spliterators.emptySpliterator()) для пустых коллекций, а клиентам — определять, что такой сплитератор не охватывает ни одного элемента. - Возвращает:
Spliteratorдля элементов этой коллекции- С версии:
- 1.8
stream
default Stream<E> stream()
Stream, источником которого является эта коллекция. Этот метод следует переопределить, если метод spliterator() не может вернуть сплитератор с характеристикой IMMUTABLE или CONCURRENT либо сплитератор, связываемый с задержкой. (Подробности см. в описании spliterator().)
- Требования к реализации:
- Реализация по умолчанию создает последовательный
Streamна основеSpliteratorколлекции. - Возвращает:
- последовательный
Streamдля элементов этой коллекции - С версии:
- 1.8
parallelStream
default Stream<E> parallelStream()
Stream, источником которого является эта коллекция. Этот метод может возвращать последовательный поток. Этот метод следует переопределить, если метод spliterator() не может вернуть сплитератор с характеристикой IMMUTABLE или CONCURRENT либо сплитератор, связываемый с задержкой. (Подробности см. в описании spliterator().)
- Требования к реализации:
- Реализация по умолчанию создает параллельный
Streamна основеSpliteratorколлекции. - Возвращает:
- потенциально параллельный
Streamдля элементов этой коллекции - С версии:
- 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://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/util/Collection.html