Интерфейс Map<K, V>
- Параметры типа:
K— тип ключей, хранящихся в этой картеV— тип сопоставленных значений
- Все известные подинтерфейсы:
Bindings, ConcurrentMap<K,V>, ConcurrentNavigableMap<K, V>, NavigableMap<K, V>, SequencedMap<K, V>, SortedMap<K, V>
- Все известные реализующие классы:
AbstractMap, Attributes, AuthProvider, ConcurrentHashMap, ConcurrentSkipListMap, EnumMap, HashMap, Hashtable, Headers, IdentityHashMap, LinkedHashMap, PrinterStateReasons, Properties, Provider, RenderingHints, SimpleBindings, TabularDataSupport, TreeMap, UIDefaults, WeakHashMap
public interface Map<K,V>
Этот интерфейс заменяет класс Dictionary, который был полностью абстрактным классом, а не интерфейсом.
Интерфейс Map предоставляет три представления коллекции, позволяющие просматривать содержимое карты как множество ключей, коллекцию значений или множество сопоставлений ключ-значение. Порядок карты определяется порядком, в котором итераторы представлений коллекции этой карты возвращают элементы. Некоторые реализации карт, например класс TreeMap, дают конкретные гарантии относительно порядка обхода; другие, например класс HashMap, таких гарантий не дают. Карты с заданным порядком обхода, как правило, являются подтипами интерфейса SequencedMap.
Примечание. При использовании изменяемых объектов в качестве ключей карты следует проявлять большую осторожность. Поведение карты не определено, если значение объекта изменяется таким образом, что это влияет на сравнения equals, пока этот объект является ключом карты. Частный случай этого запрета — недопустимость включения самой карты в качестве ключа. Хотя карте разрешено содержать саму себя в качестве значения, настоятельно рекомендуется проявлять крайнюю осторожность: методы equals и hashCode для такой карты больше не имеют однозначного определения.
Все универсальные классы-реализации карт должны предоставлять два «стандартных» конструктора: конструктор без аргументов, создающий пустую карту, и конструктор с одним аргументом типа Map, создающий новую карту с теми же сопоставлениями ключ-значение, что и переданный аргумент. Фактически второй конструктор позволяет пользователю копировать любую карту, создавая эквивалентную карту требуемого класса. Обеспечить выполнение этой рекомендации невозможно (интерфейсы не могут содержать конструкторы), однако все универсальные реализации карт в JDK ей соответствуют.
«Разрушающие» методы этого интерфейса, то есть методы, изменяющие карту, к которой они применяются, должны выбрасывать UnsupportedOperationException, если эта карта не поддерживает операцию. В этом случае такие методы могут, но не обязаны выбрасывать UnsupportedOperationException, если вызов не оказал бы никакого воздействия на карту. Например, при вызове метода putAll(Map) для неизменяемой карты исключение может быть выброшено, но это не обязательно, если карта, сопоставления которой должны быть «наложены», пуста.
Некоторые реализации карт ограничивают набор ключей и значений, которые они могут содержать. Например, некоторые реализации запрещают нулевые ключи и значения, а некоторые ограничивают типы ключей. Попытка вставить недопустимый ключ или значение приводит к выбросу непроверяемого исключения, обычно NullPointerException или ClassCastException. Попытка проверить наличие недопустимого ключа или значения может привести к выбросу исключения либо просто вернуть false; одни реализации ведут себя первым образом, другие — вторым. В более общем случае попытка выполнить операцию с недопустимым ключом или значением, завершение которой не привело бы к вставке недопустимого элемента в карту, может привести к выбросу исключения или завершиться успешно — по усмотрению реализации. В спецификации этого интерфейса такие исключения помечены как «необязательные».
Многие методы интерфейсов Collections Framework определены через метод equals. Например, в спецификации метода containsKey(Object key) сказано: «возвращает true тогда и только тогда, когда эта карта содержит сопоставление для ключа k, такого, что (key==null ? k==null : key.equals(k))». Эту спецификацию не следует интерпретировать как подразумевающую, что вызов Map.containsKey с ненулевым аргументом key приведёт к вызову key.equals(k) для любого ключа k. Реализации могут использовать оптимизации, позволяющие избежать вызова equals, например предварительно сравнивая хеш-коды двух ключей. (Спецификация Object.hashCode() гарантирует, что объекты с разными хеш-кодами не могут быть равны.) В более общем случае реализации различных интерфейсов Collections Framework могут использовать заданное поведение нижележащих методов Object там, где разработчик считает это уместным.
Некоторые операции с картой, выполняющие рекурсивный обход карты, могут завершиться исключением для самоссылочных экземпляров, в которых карта прямо или косвенно содержит саму себя. К ним относятся методы clone(), equals(), hashCode() и toString(). Реализации могут по желанию обрабатывать сценарий с самоссылкой, однако большинство существующих реализаций этого не делают.
Неизменяемые карты
Статические фабричные методы Map.of, Map.ofEntries, Map.copyOf и ofLazy(Set, Function)ПРЕДВАРИТЕЛЬНЫЙ ПРОСМОТР предоставляют удобный способ создания неизменяемых карт. Экземпляры Map, созданные этими методами, обладают следующими характеристиками:
- Они неизменяемы. Ключи и значения нельзя добавлять, удалять или обновлять. Вызов любого метода-мутатора для Map всегда приводит к выбросу
UnsupportedOperationException. Однако, если содержащиеся ключи или значения сами являются изменяемыми, это может привести к непоследовательному поведению Map или видимому изменению её содержимого. - Они не допускают
nullв качестве ключей и значений. Попытки создать их сnullв качестве ключей или значений приводят кNullPointerException. - Если не указано иное, они сериализуемы, если все ключи и значения сериализуемы.
- Они отклоняют повторяющиеся ключи во время создания. Передача повторяющихся ключей статическому фабричному методу приводит к
IllegalArgumentException. - Порядок обхода сопоставлений не определён и может изменяться.
- Они являются основанными на значениях. Программистам следует считать взаимозаменяемыми экземпляры, которые равны, и не использовать их для синхронизации, иначе может возникнуть непредсказуемое поведение. Например, в будущей версии синхронизация может завершиться сбоем. Вызывающим кодам не следует делать предположений об идентичности возвращаемых экземпляров. Фабричные методы могут создавать новые экземпляры или повторно использовать существующие.
- Они сериализуются в соответствии с описанием на странице Сериализованная форма.
Этот интерфейс является частью Java Collections Framework.
- Начиная с версии:
- 1.2
- См. также:
Краткое описание вложенных классов
| Модификатор и тип | Интерфейс | Описание |
|---|---|---|
static interface |
Map.Entry<K, |
Запись карты (пара ключ-значение). |
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
void |
clear() |
Удаляет все сопоставления из этой карты (необязательная операция). |
default V |
compute |
Пытается вычислить сопоставление для указанного ключа и текущего сопоставленного ему значения или null, если текущего сопоставления нет (необязательная операция). |
default V |
computeIfAbsent |
Если указанному ключу ещё не сопоставлено значение (или ему сопоставлено null), пытается вычислить его значение с помощью заданной функции сопоставления и добавляет его в эту карту, если результат не равен null (необязательная операция). |
default V |
computeIfPresent |
Если для указанного ключа имеется ненулевое значение, пытается вычислить новое сопоставление на основе ключа и текущего сопоставленного ему значения (необязательная операция). |
boolean |
containsKey |
Возвращает true, если эта карта содержит сопоставление для указанного ключа. |
boolean |
containsValue |
Возвращает true, если эта карта сопоставляет указанному значению один или несколько ключей. |
static <K, |
copyOf |
Возвращает неизменяемую карту, содержащую записи заданной карты. |
static <K, |
entry |
Возвращает неизменяемый Map.Entry, содержащий заданные ключ и значение. |
Set |
entrySet() |
Возвращает представление сопоставлений, содержащихся в этой карте, в виде Set. |
boolean |
equals |
Сравнивает указанный объект с этой картой на предмет равенства. |
default void |
forEach |
Выполняет заданное действие для каждой записи этой карты, пока не будут обработаны все записи или действие не выбросит исключение. |
V |
get |
Возвращает значение, сопоставленное указанному ключу, или null, если эта карта не содержит сопоставления для ключа. |
default V |
getOrDefault |
Возвращает значение, сопоставленное указанному ключу, или defaultValue, если эта карта не содержит сопоставления для ключа. |
int |
hashCode() |
Возвращает значение хеш-кода этой карты. |
boolean |
isEmpty() |
Возвращает true, если эта карта не содержит сопоставлений ключ-значение. |
Set |
keySet() |
Возвращает представление ключей, содержащихся в этой карте, в виде Set. |
default V |
merge |
Если указанному ключу ещё не сопоставлено значение или ему сопоставлено значение null, сопоставляет ему заданное ненулевое значение (необязательная операция). |
static <K, |
of() |
Возвращает неизменяемую карту, содержащую ноль сопоставлений. |
static <K, |
of |
Возвращает неизменяемую карту, содержащую одно сопоставление. |
static <K, |
of |
Возвращает неизменяемую карту, содержащую два сопоставления. |
static <K, |
of |
Возвращает неизменяемую карту, содержащую три сопоставления. |
static <K, |
of |
Возвращает неизменяемую карту, содержащую четыре сопоставления. |
static <K, |
of |
Возвращает неизменяемую карту, содержащую пять сопоставлений. |
static <K, |
of |
Возвращает неизменяемую карту, содержащую шесть сопоставлений. |
static <K, |
of |
Возвращает неизменяемую карту, содержащую семь сопоставлений. |
static <K, |
of |
Возвращает неизменяемую карту, содержащую восемь сопоставлений. |
static <K, |
of |
Возвращает неизменяемую карту, содержащую девять сопоставлений. |
static <K, |
of |
Возвращает неизменяемую карту, содержащую десять сопоставлений. |
static <K, |
ofEntries |
Возвращает неизменяемую карту, содержащую ключи и значения, извлечённые из заданных записей. |
static <K, |
ofLazy |
Предварительный просмотр. Возвращает новую карту с ленивым вычислением, используя предоставленный keys. |
V |
put |
Сопоставляет указанное значение указанному ключу в этой карте (необязательная операция). |
void |
putAll |
Копирует все сопоставления из указанной карты в эту карту (необязательная операция). |
default V |
putIfAbsent |
Если указанному ключу ещё не сопоставлено значение (или ему сопоставлено null), сопоставляет ему заданное значение и возвращает null; в противном случае возвращает текущее значение (необязательная операция). |
V |
remove |
Удаляет сопоставление для ключа из этой карты, если оно имеется (необязательная операция). |
default boolean |
remove |
Удаляет запись для указанного ключа, только если в данный момент ему сопоставлено указанное значение (необязательная операция). |
default V |
replace |
Заменяет запись для указанного ключа, только если в данный момент ему сопоставлено какое-либо значение (необязательная операция). |
default boolean |
replace |
Заменяет запись для указанного ключа, только если в данный момент ему сопоставлено указанное значение (необязательная операция). |
default void |
replaceAll |
Заменяет значение каждой записи результатом вызова заданной функции для этой записи, пока не будут обработаны все записи или функция не выбросит исключение (необязательная операция). |
int |
size() |
Возвращает количество сопоставлений ключ-значение в этой карте. |
Collection |
values() |
Возвращает представление значений, содержащихся в этой карте, в виде Collection. |
Подробное описание методов
size
int size()
Integer.MAX_VALUE элементов, возвращает Integer.MAX_VALUE.- Возвращает:
- количество отображений ключ-значение в этой карте
isEmpty
boolean isEmpty()
true, если эта карта не содержит отображений ключ-значение.- Возвращает:
-
true, если эта карта не содержит отображений ключ-значение
containsKey
boolean containsKey(Object key)
true, если эта карта содержит отображение для указанного ключа. Точнее, возвращает true тогда и только тогда, когда эта карта содержит отображение для ключа k, такого что Objects.equals(key, k). (Такое отображение может быть не более чем одно.)- Параметры:
-
key— ключ, наличие которого в этой карте нужно проверить - Возвращает:
-
true, если эта карта содержит отображение для указанного ключа - Вызывает:
-
ClassCastException— если тип ключа не подходит для этой карты (необязательно) -
NullPointerException— если указанный ключ равен null, а эта карта не допускает null-ключи (необязательно)
containsValue
boolean containsValue(Object value)
true, если эта карта отображает один или несколько ключей в указанное значение. Точнее, возвращает true тогда и только тогда, когда эта карта содержит хотя бы одно отображение в значение v, такое что Objects.equals(value, v). Для большинства реализаций интерфейса Map эта операция, вероятно, потребует времени, линейно зависящего от размера карты.- Параметры:
-
value— значение, наличие которого в этой карте нужно проверить - Возвращает:
-
true, если эта карта отображает один или несколько ключей в указанное значение - Вызывает:
-
ClassCastException— если тип значения не подходит для этой карты (необязательно) -
NullPointerException— если указанное значение равно null, а эта карта не допускает null-значения (необязательно)
get
V get(Object key)
null, если эта карта не содержит отображения для ключа. Точнее, если эта карта содержит отображение ключа k в значение v, такое что Objects.equals(key, k), этот метод возвращает v; в противном случае он возвращает null. (Такое отображение может быть не более чем одно.)
Если эта карта допускает null-значения, возвращаемое значение null не обязательно означает, что карта не содержит отображения для ключа; также возможно, что карта явно отображает ключ в null. Операцию containsKey можно использовать, чтобы различить эти два случая.
- Параметры:
-
key— ключ, связанное значение которого нужно вернуть - Возвращает:
- значение, в которое отображается указанный ключ, или
null, если эта карта не содержит отображения для ключа - Вызывает:
-
ClassCastException— если тип ключа не подходит для этой карты (необязательно) -
NullPointerException— если указанный ключ равен null, а эта карта не допускает null-ключи (необязательно)
put
V put(K key, V value)
m содержит отображение для ключа k тогда и только тогда, когда m.containsKey(k) возвращает true.)- Параметры:
-
key— ключ, с которым нужно связать указанное значение -
value— значение, которое нужно связать с указанным ключом - Возвращает:
- предыдущее значение, связанное с
key, илиnull, если дляkeyне было отображения. (Возвращаемое значениеnullтакже может означать, что ранее карта связывалаnullсkey, если реализация поддерживает значенияnull.) - Вызывает:
-
UnsupportedOperationException— если эта карта не поддерживает операциюput -
ClassCastException— если класс указанного ключа или значения не позволяет сохранить его в этой карте -
NullPointerException— если указанный ключ или значение равны null, а эта карта не допускает null-ключи или null-значения -
IllegalArgumentException— если какое-либо свойство указанного ключа или значения не позволяет сохранить его в этой карте
remove
V remove(Object key)
k в значение v, такое что Objects.equals(key, k), это отображение удаляется. (Карта может содержать не более одного такого отображения.) Возвращает значение, с которым эта карта ранее связывала ключ, или null, если карта не содержала отображения для ключа.
Если эта карта допускает null-значения, возвращаемое значение null не обязательно означает, что карта не содержала отображения для ключа; также возможно, что карта явно отображала ключ в null.
После возврата вызова карта не будет содержать отображения для указанного ключа.
- Параметры:
-
key— ключ, отображение которого нужно удалить из карты - Возвращает:
- предыдущее значение, связанное с
key, илиnull, если дляkeyне было отображения. - Вызывает:
-
UnsupportedOperationException— если эта карта не поддерживает операциюremove -
ClassCastException— если тип ключа не подходит для этой карты (необязательно) -
NullPointerException— если указанный ключ равен null, а эта карта не допускает null-ключи (необязательно)
putAll
void putAll(Map<? extends K, ? extends V> m)
put(k, v) для каждого отображения ключа k в значение v в указанной карте. Поведение этой операции не определено, если указанная карта изменяется во время выполнения операции. Если для указанной карты задан порядок обхода, обработка её отображений обычно происходит в этом порядке.- Параметры:
-
m— отображения, которые нужно сохранить в этой карте - Вызывает:
-
UnsupportedOperationException— если эта карта не поддерживает операциюputAll -
ClassCastException— если класс ключа или значения в указанной карте не позволяет сохранить его в этой карте -
NullPointerException— если указанная карта равна null либо если эта карта не допускает null-ключи или null-значения, а указанная карта содержит null-ключи или null-значения -
IllegalArgumentException— если какое-либо свойство ключа или значения в указанной карте не позволяет сохранить его в этой карте
clear
void clear()
- Вызывает:
-
UnsupportedOperationException— если эта карта не поддерживает операциюclear
keySet
Set<K> keySet()
Set ключей, содержащихся в этой карте. Набор поддерживается картой, поэтому изменения карты отражаются в наборе и наоборот. Если карта изменяется во время обхода набора (кроме изменений посредством собственной операции remove итератора), результаты обхода не определены. Набор поддерживает удаление элементов, при котором соответствующее отображение удаляется из карты, с помощью операций Iterator.remove, Set.remove, removeAll, retainAll и clear. Операции add и addAll не поддерживаются.- Возвращает:
- представление в виде набора ключей, содержащихся в этой карте
values
Collection<V> values()
Collection значений, содержащихся в этой карте. Коллекция поддерживается картой, поэтому изменения карты отражаются в коллекции и наоборот. Если карта изменяется во время обхода коллекции (кроме изменений посредством собственной операции remove итератора), результаты обхода не определены. Коллекция поддерживает удаление элементов, при котором соответствующее отображение удаляется из карты, с помощью операций Iterator.remove, Collection.remove, removeAll, retainAll и clear. Операции add и addAll не поддерживаются.- Возвращает:
- представление в виде коллекции значений, содержащихся в этой карте
entrySet
Set<Map.Entry<K,V>> entrySet()
Set отображений, содержащихся в этой карте. Набор поддерживается картой, поэтому изменения карты отражаются в наборе и наоборот. Если карта изменяется во время обхода набора (кроме изменений посредством собственной операции remove итератора или операции setValue над записью карты, возвращённой итератором), результаты обхода не определены. Набор поддерживает удаление элементов, при котором соответствующее отображение удаляется из карты, с помощью операций Iterator.remove, Set.remove, removeAll, retainAll и clear. Операции add и addAll не поддерживаются.- Возвращает:
- представление в виде набора отображений, содержащихся в этой карте
equals
boolean equals(Object o)
true, если переданный объект также является картой и обе карты представляют одинаковые отображения. Точнее, две карты m1 и m2 представляют одинаковые отображения, если m1.entrySet().equals(m2.entrySet()). Это гарантирует корректную работу метода equals для различных реализаций интерфейса Map.hashCode
int hashCode()
entrySet() этой карты. Это гарантирует, что m1.equals(m2) влечёт m1.hashCode()==m2.hashCode() для любых двух карт m1 и m2, как того требует общий контракт Object.hashCode().getOrDefault
default V getOrDefault(Object key, V defaultValue)
defaultValue, если эта карта не содержит отображения для ключа.- Требования к реализации:
- Реализация по умолчанию не даёт никаких гарантий относительно свойств синхронизации или атомарности этого метода. Любая реализация, обеспечивающая гарантии атомарности, должна переопределить этот метод и задокументировать свойства его параллельного выполнения.
- Параметры:
-
key— ключ, связанное значение которого нужно вернуть -
defaultValue— отображение ключа по умолчанию - Возвращает:
- значение, в которое отображается указанный ключ, или
defaultValue, если эта карта не содержит отображения для ключа - Вызывает:
-
ClassCastException— если тип ключа не подходит для этой карты (необязательно) -
NullPointerException— если указанный ключ равен null, а эта карта не допускает null-ключи (необязательно) - Начиная с версии:
- 1.8
forEach
default void forEach(BiConsumer<? super K, ? super V> action)
- Требования к реализации:
- Реализация по умолчанию эквивалентна следующему для этой
map:
Реализация по умолчанию не даёт никаких гарантий относительно свойств синхронизации или атомарности этого метода. Любая реализация, обеспечивающая гарантии атомарности, должна переопределить этот метод и задокументировать свойства его параллельного выполнения.for (Map.Entry<K, V> entry : map.entrySet()) action.accept(entry.getKey(), entry.getValue()); - Параметры:
-
action— действие, выполняемое для каждой записи - Вызывает:
-
NullPointerException— если указанное действие равно null -
ConcurrentModificationException— если во время обхода обнаружено удаление записи - Начиная с версии:
- 1.8
replaceAll
default void replaceAll(BiFunction<? super K, ? super V, ? extends V> function)
- Требования к реализации:
-
Реализация по умолчанию эквивалентна следующему для этой
map:for (Map.Entry<K, V> entry : map.entrySet()) entry.setValue(function.apply(entry.getKey(), entry.getValue()));Реализация по умолчанию не даёт никаких гарантий относительно свойств синхронизации или атомарности этого метода. Любая реализация, обеспечивающая гарантии атомарности, должна переопределить этот метод и задокументировать свойства его параллельного выполнения.
- Параметры:
-
function— функция, применяемая к каждой записи - Вызывает:
-
UnsupportedOperationException— если эта карта не поддерживает операциюreplaceAll(необязательно) -
ClassCastException— если класс заменяющего значения не позволяет сохранить его в этой карте (необязательно) -
NullPointerException— если указанная функция равна null либо если заменяющее значение равно null, а эта карта не допускает null-значения (необязательно) -
IllegalArgumentException— если какое-либо свойство заменяющего значения не позволяет сохранить его в этой карте (необязательно) -
ConcurrentModificationException— если во время обхода обнаружено удаление записи - Начиная с версии:
- 1.8
putIfAbsent
default V putIfAbsent(K key, V value)
null), связывает его с указанным значением и возвращает null, в противном случае возвращает текущее значение (необязательная операция).- Требования к реализации:
- Реализация по умолчанию эквивалентна следующему для этой
map:V v = map.get(key); if (v == null) v = map.put(key, value); return v;Реализация по умолчанию не даёт никаких гарантий относительно свойств синхронизации или атомарности этого метода. Любая реализация, обеспечивающая гарантии атомарности, должна переопределить этот метод и задокументировать свойства его параллельного выполнения.
- Параметры:
-
key— ключ, с которым нужно связать указанное значение -
value— значение, которое нужно связать с указанным ключом - Возвращает:
- предыдущее значение, связанное с указанным ключом, или
null, если для ключа не было отображения. (Возвращаемое значениеnullтакже может означать, что ранее карта связывалаnullс ключом, если реализация поддерживает null-значения.) - Вызывает:
-
UnsupportedOperationException— если эта карта не поддерживает операциюputIfAbsent(необязательно) -
ClassCastException— если тип ключа или значения не подходит для этой карты (необязательно) -
NullPointerException— если указанный ключ или значение равны null, а эта карта не допускает null-ключи или null-значения (необязательно) -
IllegalArgumentException— если какое-либо свойство указанного ключа или значения не позволяет сохранить его в этой карте (необязательно) - Начиная с версии:
- 1.8
remove
default boolean remove(Object key, Object value)
- Требования к реализации:
- Реализация по умолчанию эквивалентна следующему для этой
map:if (map.containsKey(key) && Objects.equals(map.get(key), value)) { map.remove(key); return true; } else return false;Реализация по умолчанию не даёт никаких гарантий относительно свойств синхронизации или атомарности этого метода. Любая реализация, обеспечивающая гарантии атомарности, должна переопределить этот метод и задокументировать свойства его параллельного выполнения.
- Параметры:
-
key— ключ, с которым связано указанное значение -
value— значение, которое, как ожидается, связано с указанным ключом - Возвращает:
-
true, если значение было удалено - Вызывает:
-
UnsupportedOperationException— если эта карта не поддерживает операциюremove(необязательно) -
ClassCastException— если тип ключа или значения не подходит для этой карты (необязательно) -
NullPointerException— если указанный ключ или значение равны null, а эта карта не допускает null-ключи или null-значения (необязательно) - Начиная с версии:
- 1.8
replace
default boolean replace(K key, V oldValue, V newValue)
- Требования к реализации:
- Реализация по умолчанию эквивалентна следующему для этой
map:
Реализация по умолчанию не вызывает NullPointerException для карт, не поддерживающих null-значения, если oldValue равен null, кроме случая, когда newValue также равен null.if (map.containsKey(key) && Objects.equals(map.get(key), oldValue)) { map.put(key, newValue); return true; } else return false;Реализация по умолчанию не даёт никаких гарантий относительно свойств синхронизации или атомарности этого метода. Любая реализация, обеспечивающая гарантии атомарности, должна переопределить этот метод и задокументировать свойства его параллельного выполнения.
- Параметры:
-
key— ключ, с которым связано указанное значение -
oldValue— значение, которое, как ожидается, связано с указанным ключом -
newValue— значение, которое нужно связать с указанным ключом - Возвращает:
-
true, если значение было заменено - Вызывает:
-
UnsupportedOperationException— если эта карта не поддерживает операциюreplace(необязательно) -
ClassCastException— если класс указанного ключа или значения не позволяет сохранить его в этой карте -
NullPointerException— если указанный ключ или newValue равны null, а эта карта не допускает null-ключи или null-значения -
NullPointerException— если oldValue равен null, а эта карта не допускает null-значения (необязательно) -
IllegalArgumentException— если какое-либо свойство указанного ключа или значения не позволяет сохранить его в этой карте - Начиная с версии:
- 1.8
replace
default V replace(K key, V value)
- Требования к реализации:
- Реализация по умолчанию эквивалентна следующему для этой
map:if (map.containsKey(key)) { return map.put(key, value); } else return null;Реализация по умолчанию не даёт никаких гарантий относительно свойств синхронизации или атомарности этого метода. Любая реализация, обеспечивающая гарантии атомарности, должна переопределить этот метод и задокументировать свойства его параллельного выполнения.
- Параметры:
-
key— ключ, с которым связано указанное значение -
value— значение, которое нужно связать с указанным ключом - Возвращает:
- предыдущее значение, связанное с указанным ключом, или
null, если для ключа не было отображения. (Возвращаемое значениеnullтакже может означать, что ранее карта связывалаnullс ключом, если реализация поддерживает null-значения.) - Вызывает:
-
UnsupportedOperationException— если эта карта не поддерживает операциюreplace(необязательно) -
ClassCastException— если класс указанного ключа или значения не позволяет сохранить его в этой карте (необязательно) -
NullPointerException— если указанный ключ или значение равны null, а эта карта не допускает null-ключи или null-значения -
IllegalArgumentException— если какое-либо свойство указанного ключа или значения не позволяет сохранить его в этой карте - Начиная с версии:
- 1.8
computeIfAbsent
default V computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction)
null), пытается вычислить его значение с помощью заданной функции отображения и вносит его в эту карту, если только null (необязательная операция). Если функция отображения возвращает null, отображение не сохраняется. Если сама функция отображения вызывает (непроверяемое) исключение, оно повторно выбрасывается, и отображение не сохраняется. Чаще всего этот метод используется для создания нового объекта в качестве начального отображаемого значения или мемоизированного результата, например:
map.computeIfAbsent(key, k -> new Value(f(k)));
Или для реализации карты с несколькими значениями, Map<K,Collection<V>>, поддерживающей несколько значений для каждого ключа:
map.computeIfAbsent(key, k -> new HashSet<V>()).add(v);
Функция отображения не должна изменять эту карту во время вычисления.
- Требования к реализации:
- Реализация по умолчанию эквивалентна следующим шагам для этой
mapс последующим возвратом текущего значения илиnull, если значение теперь отсутствует:if (map.get(key) == null) { V newValue = mappingFunction.apply(key); if (newValue != null) map.put(key, newValue); }Реализация по умолчанию не гарантирует обнаружение изменений этой карты функцией отображения во время вычисления и, при необходимости, сообщение об ошибке. Реализации без поддержки параллельного доступа должны переопределить этот метод и по возможности выбрасывать
ConcurrentModificationException, если обнаружено, что функция отображения изменяет эту карту во время вычисления. Реализации с поддержкой параллельного доступа должны переопределить этот метод и по возможности выбрасыватьIllegalStateException, если обнаружено, что функция отображения изменяет эту карту во время вычисления, вследствие чего вычисление никогда не завершится.Реализация по умолчанию не даёт никаких гарантий относительно свойств синхронизации или атомарности этого метода. Любая реализация, обеспечивающая гарантии атомарности, должна переопределить этот метод и задокументировать свойства его параллельного выполнения. В частности, все реализации подинтерфейса
ConcurrentMapдолжны документировать, применяется ли функция отображения атомарно один раз только в том случае, если значение отсутствует. - Параметры:
-
key— ключ, с которым нужно связать указанное значение -
mappingFunction— функция отображения для вычисления значения - Возвращает:
- текущее (существующее или вычисленное) значение, связанное с указанным ключом, или null, если вычисленное значение равно null
- Вызывает:
-
NullPointerException— если указанный ключ равен null, а эта карта не поддерживает null-ключи, либо если mappingFunction равна null -
UnsupportedOperationException— если эта карта не поддерживает операциюcomputeIfAbsent(необязательно) -
ClassCastException— если класс указанного ключа или значения не позволяет сохранить его в этой карте (необязательно) -
IllegalArgumentException— если какое-либо свойство указанного ключа или значения не позволяет сохранить его в этой карте (необязательно) - Начиная с версии:
- 1.8
computeIfPresent
default V computeIfPresent(K key, BiFunction<? super K, ? super V, ? extends V> remappingFunction)
Если функция переназначения возвращает null, соответствие удаляется. Если сама функция переназначения выбрасывает (непроверяемое) исключение, оно выбрасывается повторно, а текущее соответствие остается неизменным.
Во время вычисления функция переназначения не должна изменять эту карту.
- Требования к реализации:
- Реализация по умолчанию эквивалентна выполнению следующих шагов для этого
mapс последующим возвратом текущего значения илиnull, если оно отсутствует:if (map.get(key) != null) { V oldValue = map.get(key); V newValue = remappingFunction.apply(key, oldValue); if (newValue != null) map.put(key, newValue); else map.remove(key); }Реализация по умолчанию не гарантирует обнаружение изменения этой карты функцией переназначения во время вычисления и, если это уместно, сообщение об ошибке. Реализации без поддержки конкурентного доступа должны переопределять этот метод и по возможности выбрасывать
ConcurrentModificationException, если обнаружено, что функция переназначения изменяет эту карту во время вычисления. Реализации с поддержкой конкурентного доступа должны переопределять этот метод и по возможности выбрасыватьIllegalStateException, если обнаружено, что функция переназначения изменяет эту карту во время вычисления, в результате чего вычисление никогда не завершится.Реализация по умолчанию не гарантирует свойств синхронизации или атомарности этого метода. Любая реализация, предоставляющая гарантии атомарности, должна переопределять этот метод и документировать свойства конкурентного доступа. В частности, все реализации подинтерфейса
ConcurrentMapдолжны документировать, применяется ли функция переназначения атомарно один раз только в том случае, если значение отсутствует. - Параметры:
-
key- ключ, с которым должно быть связано указанное значение -
remappingFunction- функция переназначения для вычисления значения - Возвращает:
- новое значение, связанное с указанным ключом, или null, если значение отсутствует
- Выбрасывает:
-
NullPointerException- если указанный ключ равен null, а эта карта не поддерживает ключи null, или если remappingFunction равна null -
UnsupportedOperationException- если операцияcomputeIfPresentне поддерживается этой картой (необязательно) -
ClassCastException- если класс указанного ключа или значения препятствует его сохранению в этой карте (необязательно) -
IllegalArgumentException- если какое-либо свойство указанного ключа или значения препятствует его сохранению в этой карте (необязательно) - С версии:
- 1.8
compute
default V compute(K key, BiFunction<? super K, ? super V, ? extends V> remappingFunction)
null, если текущее соответствие отсутствует (необязательная операция). Например, чтобы создать или добавить String msg к сопоставленному значению: map.compute(key, (k, v) -> (v == null) ? msg : v.concat(msg)) (Для таких целей часто проще использовать метод merge().) Если функция переназначения возвращает null, соответствие удаляется (или остается отсутствующим, если изначально его не было). Если сама функция переназначения выбрасывает (непроверяемое) исключение, оно выбрасывается повторно, а текущее соответствие остается неизменным.
Во время вычисления функция переназначения не должна изменять эту карту.
- Требования к реализации:
- Реализация по умолчанию эквивалентна выполнению следующих шагов для этого
map:V oldValue = map.get(key); V newValue = remappingFunction.apply(key, oldValue); if (newValue != null) { map.put(key, newValue); } else if (oldValue != null || map.containsKey(key)) { map.remove(key); } return newValue;Реализация по умолчанию не гарантирует обнаружение изменения этой карты функцией переназначения во время вычисления и, если это уместно, сообщение об ошибке. Реализации без поддержки конкурентного доступа должны переопределять этот метод и по возможности выбрасывать
ConcurrentModificationException, если обнаружено, что функция переназначения изменяет эту карту во время вычисления. Реализации с поддержкой конкурентного доступа должны переопределять этот метод и по возможности выбрасыватьIllegalStateException, если обнаружено, что функция переназначения изменяет эту карту во время вычисления, в результате чего вычисление никогда не завершится.Реализация по умолчанию не гарантирует свойств синхронизации или атомарности этого метода. Любая реализация, предоставляющая гарантии атомарности, должна переопределять этот метод и документировать свойства конкурентного доступа. В частности, все реализации подинтерфейса
ConcurrentMapдолжны документировать, применяется ли функция переназначения атомарно один раз только в том случае, если значение отсутствует. - Параметры:
-
key- ключ, с которым должно быть связано указанное значение -
remappingFunction- функция переназначения для вычисления значения - Возвращает:
- новое значение, связанное с указанным ключом, или null, если значение отсутствует
- Выбрасывает:
-
NullPointerException- если указанный ключ равен null, а эта карта не поддерживает ключи null, или если remappingFunction равна null -
UnsupportedOperationException- если операцияcomputeне поддерживается этой картой (необязательно) -
ClassCastException- если класс указанного ключа или значения препятствует его сохранению в этой карте (необязательно) -
IllegalArgumentException- если какое-либо свойство указанного ключа или значения препятствует его сохранению в этой карте (необязательно) - С версии:
- 1.8
merge
default V merge(K key, V value, BiFunction<? super V, ? super V, ? extends V> remappingFunction)
null. Этот метод может быть полезен при объединении нескольких сопоставленных значений для ключа. Например, чтобы создать или добавить String msg к сопоставленному значению: map.merge(key, msg, String::concat)
Если функция переназначения возвращает null, соответствие удаляется. Если сама функция переназначения выбрасывает (непроверяемое) исключение, оно выбрасывается повторно, а текущее соответствие остается неизменным.
Во время вычисления функция переназначения не должна изменять эту карту.
- Требования к реализации:
- Реализация по умолчанию эквивалентна выполнению следующих шагов для этого
mapс последующим возвратом текущего значения илиnull, если значение отсутствует:V oldValue = map.get(key); V newValue = (oldValue == null) ? value : remappingFunction.apply(oldValue, value); if (newValue == null) map.remove(key); else map.put(key, newValue);Реализация по умолчанию не гарантирует обнаружение изменения этой карты функцией переназначения во время вычисления и, если это уместно, сообщение об ошибке. Реализации без поддержки конкурентного доступа должны переопределять этот метод и по возможности выбрасывать
ConcurrentModificationException, если обнаружено, что функция переназначения изменяет эту карту во время вычисления. Реализации с поддержкой конкурентного доступа должны переопределять этот метод и по возможности выбрасыватьIllegalStateException, если обнаружено, что функция переназначения изменяет эту карту во время вычисления, в результате чего вычисление никогда не завершится.Реализация по умолчанию не гарантирует свойств синхронизации или атомарности этого метода. Любая реализация, предоставляющая гарантии атомарности, должна переопределять этот метод и документировать свойства конкурентного доступа. В частности, все реализации подинтерфейса
ConcurrentMapдолжны документировать, применяется ли функция переназначения атомарно один раз только в том случае, если значение отсутствует. - Параметры:
-
key- ключ, с которым должно быть связано результирующее значение -
value- ненулевое значение, которое нужно объединить с существующим значением, связанным с ключом, или связать с ключом, если существующее значение отсутствует или равно null -
remappingFunction- функция переназначения для повторного вычисления значения, если оно присутствует - Возвращает:
- новое значение, связанное с указанным ключом, или null, если с ключом не связано никакое значение
- Выбрасывает:
-
UnsupportedOperationException- если операцияmergeне поддерживается этой картой (необязательно) -
ClassCastException- если класс указанного ключа или значения препятствует его сохранению в этой карте (необязательно) -
IllegalArgumentException- если какое-либо свойство указанного ключа или значения препятствует его сохранению в этой карте (необязательно) -
NullPointerException- если указанный ключ равен null, а эта карта не поддерживает ключи null, либо если значение или remappingFunction равны null - С версии:
- 1.8
of
static <K,V> Map<K,V> of()
- Параметры типа:
K- тип ключа картыMapV- тип значения картыMap- Возвращает:
- пустую
Map - С версии:
- 9
of
static <K,V> Map<K,V> of(K k1, V v1)
- Параметры типа:
K- тип ключа картыMapV- тип значения картыMap- Параметры:
-
k1- ключ соответствия -
v1- значение соответствия - Возвращает:
Map, содержащую указанное соответствие- Выбрасывает:
-
NullPointerException- если ключ или значение равныnull - С версии:
- 9
of
static <K,V> Map<K,V> of(K k1, V v1, K k2, V v2)
- Параметры типа:
K- тип ключа картыMapV- тип значения картыMap- Параметры:
-
k1- ключ первого соответствия -
v1- значение первого соответствия -
k2- ключ второго соответствия -
v2- значение второго соответствия - Возвращает:
Map, содержащую указанные соответствия- Выбрасывает:
-
IllegalArgumentException- если ключи дублируются -
NullPointerException- если какой-либо ключ или значение равныnull - С версии:
- 9
of
static <K,V> Map<K,V> of(K k1, V v1, K k2, V v2, K k3, V v3)
- Параметры типа:
K- тип ключа картыMapV- тип значения картыMap- Параметры:
-
k1- ключ первого соответствия -
v1- значение первого соответствия -
k2- ключ второго соответствия -
v2- значение второго соответствия -
k3- ключ третьего соответствия -
v3- значение третьего соответствия - Возвращает:
Map, содержащую указанные соответствия- Выбрасывает:
-
IllegalArgumentException- если имеются повторяющиеся ключи -
NullPointerException- если какой-либо ключ или значение равныnull - С версии:
- 9
of
static <K,V> Map<K,V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4)
- Параметры типа:
K- тип ключа картыMapV- тип значения картыMap- Параметры:
-
k1- ключ первого соответствия -
v1- значение первого соответствия -
k2- ключ второго соответствия -
v2- значение второго соответствия -
k3- ключ третьего соответствия -
v3- значение третьего соответствия -
k4- ключ четвертого соответствия -
v4- значение четвертого соответствия - Возвращает:
Map, содержащую указанные соответствия- Выбрасывает:
-
IllegalArgumentException- если имеются повторяющиеся ключи -
NullPointerException- если какой-либо ключ или значение равныnull - С версии:
- 9
of
static <K,V> Map<K,V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5)
- Параметры типа:
K- тип ключа картыMapV- тип значения картыMap- Параметры:
-
k1- ключ первого соответствия -
v1- значение первого соответствия -
k2- ключ второго соответствия -
v2- значение второго соответствия -
k3- ключ третьего соответствия -
v3- значение третьего соответствия -
k4- ключ четвертого соответствия -
v4- значение четвертого соответствия -
k5- ключ пятого соответствия -
v5- значение пятого соответствия - Возвращает:
Map, содержащую указанные соответствия- Выбрасывает:
-
IllegalArgumentException- если имеются повторяющиеся ключи -
NullPointerException- если какой-либо ключ или значение равныnull - С версии:
- 9
of
static <K,V> Map<K,V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6)
- Параметры типа:
K- тип ключа картыMapV- тип значения картыMap- Параметры:
-
k1- ключ первого соответствия -
v1- значение первого соответствия -
k2- ключ второго соответствия -
v2- значение второго соответствия -
k3- ключ третьего соответствия -
v3- значение третьего соответствия -
k4- ключ четвертого соответствия -
v4- значение четвертого соответствия -
k5- ключ пятого соответствия -
v5- значение пятого соответствия -
k6- ключ шестого соответствия -
v6- значение шестого соответствия - Возвращает:
Map, содержащую указанные соответствия- Выбрасывает:
-
IllegalArgumentException- если имеются повторяющиеся ключи -
NullPointerException- если какой-либо ключ или значение равныnull - С версии:
- 9
of
static <K,V> Map<K,V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7)
- Параметры типа:
K- тип ключа картыMapV- тип значения картыMap- Параметры:
-
k1- ключ первого соответствия -
v1- значение первого соответствия -
k2- ключ второго соответствия -
v2- значение второго соответствия -
k3- ключ третьего соответствия -
v3- значение третьего соответствия -
k4- ключ четвертого соответствия -
v4- значение четвертого соответствия -
k5- ключ пятого соответствия -
v5- значение пятого соответствия -
k6- ключ шестого соответствия -
v6- значение шестого соответствия -
k7- ключ седьмого соответствия -
v7- значение седьмого соответствия - Возвращает:
Map, содержащую указанные соответствия- Выбрасывает:
-
IllegalArgumentException- если имеются повторяющиеся ключи -
NullPointerException- если какой-либо ключ или значение равныnull - С версии:
- 9
of
static <K,V> Map<K,V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8)
- Параметры типа:
K- тип ключа картыMapV- тип значения картыMap- Параметры:
-
k1- ключ первого соответствия -
v1- значение первого соответствия -
k2- ключ второго соответствия -
v2- значение второго соответствия -
k3- ключ третьего соответствия -
v3- значение третьего соответствия -
k4- ключ четвертого соответствия -
v4- значение четвертого соответствия -
k5- ключ пятого соответствия -
v5- значение пятого соответствия -
k6- ключ шестого соответствия -
v6- значение шестого соответствия -
k7- ключ седьмого соответствия -
v7- значение седьмого соответствия -
k8- ключ восьмого соответствия -
v8- значение восьмого соответствия - Возвращает:
Map, содержащую указанные соответствия- Выбрасывает:
-
IllegalArgumentException- если имеются повторяющиеся ключи -
NullPointerException- если какой-либо ключ или значение равныnull - С версии:
- 9
of
static <K,V> Map<K,V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9)
- Параметры типа:
K- тип ключа картыMapV- тип значения картыMap- Параметры:
-
k1- ключ первого соответствия -
v1- значение первого соответствия -
k2- ключ второго соответствия -
v2- значение второго соответствия -
k3- ключ третьего соответствия -
v3- значение третьего соответствия -
k4- ключ четвертого соответствия -
v4- значение четвертого соответствия -
k5- ключ пятого соответствия -
v5- значение пятого соответствия -
k6- ключ шестого соответствия -
v6- значение шестого соответствия -
k7- ключ седьмого соответствия -
v7- значение седьмого соответствия -
k8- ключ восьмого соответствия -
v8- значение восьмого соответствия -
k9- ключ девятого соответствия -
v9- значение девятого соответствия - Возвращает:
Map, содержащую указанные соответствия- Выбрасывает:
-
IllegalArgumentException- если имеются повторяющиеся ключи -
NullPointerException- если какой-либо ключ или значение равныnull - С версии:
- 9
of
static <K,V> Map<K,V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10)
- Параметры типа:
K- тип ключа картыMapV- тип значения картыMap- Параметры:
-
k1- ключ первого соответствия -
v1- значение первого соответствия -
k2- ключ второго соответствия -
v2- значение второго соответствия -
k3- ключ третьего соответствия -
v3- значение третьего соответствия -
k4- ключ четвертого соответствия -
v4- значение четвертого соответствия -
k5- ключ пятого соответствия -
v5- значение пятого соответствия -
k6- ключ шестого соответствия -
v6- значение шестого соответствия -
k7- ключ седьмого соответствия -
v7- значение седьмого соответствия -
k8- ключ восьмого соответствия -
v8- значение восьмого соответствия -
k9- ключ девятого соответствия -
v9- значение девятого соответствия -
k10- ключ десятого соответствия -
v10- значение десятого соответствия - Возвращает:
Map, содержащую указанные соответствия- Выбрасывает:
-
IllegalArgumentException- если имеются повторяющиеся ключи -
NullPointerException- если какой-либо ключ или значение равныnull - С версии:
- 9
ofEntries
@SafeVarargs static <K,V> Map<K,V> ofEntries(Map.Entry<? extends K, ? extends V>... entries)
- Примечание к API:
- Удобно создавать записи карты с помощью метода
Map.entry(). Например,import static java.util.Map.entry; Map<Integer,String> map = Map.ofEntries( entry(1, "a"), entry(2, "b"), entry(3, "c"), ... entry(26, "z")); - Параметры типа:
K- тип ключа картыMapV- тип значения картыMap- Параметры:
-
entries-Map.Entryи, содержащие ключи и значения, из которых формируется карта - Возвращает:
Map, содержащую указанные соответствия- Выбрасывает:
-
IllegalArgumentException- если имеются повторяющиеся ключи -
NullPointerException- если любая запись, ключ или значение равныnullлибо если массивentriesравенnull - См. также:
entry
static <K,V> Map.Entry<K,V> entry(K k, V v)
Map.Entry, содержащий заданные ключ и значение. Эти записи подходят для заполнения экземпляров Map с помощью метода Map.ofEntries(). Экземпляры Entry, созданные этим методом, имеют следующие характеристики: - Они не допускают ключи и значения
null. Попытки создать их с помощью ключа или значенияnullприводят кNullPointerException. - Они неизменяемы. Вызовы
Entry.setValue()для возвращённогоEntryприводят кUnsupportedOperationException. - Они не сериализуемы.
- Они основаны на значениях (value-based). Программистам следует считать равные друг другу экземпляры равными и взаимозаменяемыми и не использовать их для синхронизации, иначе может возникнуть непредсказуемое поведение. Например, в будущей версии синхронизация может завершиться неудачей. Вызывающий код не должен делать никаких предположений об идентичности возвращённых экземпляров. Этот метод может создавать новые экземпляры или повторно использовать существующие.
- Примечание к API:
- Сериализуемый
Entryсм. вAbstractMap.SimpleEntryилиAbstractMap.SimpleImmutableEntry. - Параметры типа:
K— тип ключаV— тип значения- Параметры:
-
k— ключ -
v— значение - Возвращает:
Entry, содержащий указанные ключ и значение- Исключения:
-
NullPointerException— если ключ или значение —null - Начиная с версии:
- 9
- См. также:
copyOf
static <K,V> Map<K,V> copyOf(Map<? extends K, ? extends V> map)
- Примечание по реализации:
- Если заданная Map является неизменяемой Map, вызов copyOf обычно не создаёт копию.
- Параметры типа:
K— тип ключейMapV— тип значенийMap- Параметры:
-
map—Map, из которой берутся записи; не должна быть null - Возвращает:
Map, содержащую записи заданнойMap- Исключения:
-
NullPointerException— если map равна null или содержит ключи либо значения null - Начиная с версии:
- 10
ofLazy
static <K,V> Map<K,V> ofLazy(Set<? extends K> keys, Function<? super K, ? extends V> computingFunction)
ofLazy является предварительной версией API платформы Java. keys. Возвращённая карта является неизменяемой; её ключи известны при создании. Значения карты вычисляются по запросу с помощью предоставленного computingFunction при первом обращении к ним (например, через Map::get).
Предоставленная функция вычисления гарантированно вызывается не более одного раза для каждого ключа, даже в многопоточной среде. Потоки, одновременно обращающиеся к значению, которое уже вычисляется, будут заблокированы до вычисления значения или аварийного завершения функции вычисления.
Если вычисление, выполняемое предоставленной функцией (для ключа), приводит к выбросу непроверяемого исключения, отложенное значение не инициализируется, а переходит в состояние ошибки, после чего выбрасывается NoSuchElementException, причиной которого является непроверяемое исключение. Последующие вызовы Map::get для того же ключа выбрасывают NoSuchElementException (без повторного вызова функции вычисления), не имеющий причины и содержащий в сообщении имя класса исходного непроверяемого исключения.
Все сбои обрабатываются таким образом. Существуют два особых случая, в которых выбрасываются непроверяемые исключения:
Если функция вычисления возвращает null, будет выброшено NoSuchElementException (причиной которого является NullPointerException). Поэтому, как и другие неизменяемые карты, созданные с помощью фабричных методов Map::of, отложенно вычисляемая карта никогда не может содержать значения null. Клиенты, которым нужны значения, допускающие null, могут обернуть элементы в контейнер Optional.
Если функция вычисления рекурсивно вызывает саму себя (для того же ключа) через возвращённую отложенно вычисляемую карту, будет выброшено NoSuchElementException (причиной которого является IllegalStateException).
Значения любых представлений values() или entrySet() возвращённой карты также вычисляются по запросу.
Методы Object возвращённой карты: equals(), hashCode() и toString() могут инициировать инициализацию одного или нескольких отложенных значений. Если инициализация хотя бы одного значения завершается ошибкой, методы hashCode() и toString() выбрасывают NoSuchElementException, а Object.equals(Object) выбрасывает NoSuchElementException, если при сравнении происходит обращение к значению, которое не удалось вычислить.
Возвращённая отложенно вычисляемая карта содержит сильную ссылку на лежащую в её основе функцию вычисления, по крайней мере пока остаются невычисленные значения.
Возвращённая Map не является Serializable.
Если впоследствии предоставленный Set типа keys будет изменён, возвращённый Map не будет отражать эти изменения.
Set типа keys должен использовать equals() в качестве отношения эквивалентности, либо его метод сравнения должен быть согласован с equals; в противном случае поведение не определено.
Ниже приведён пример приложения, кэширующего значения, возвращаемые некоторыми expensiveOperation(int param) для заданного набора входных параметров. Используя отложенно вычисляемую карту, мы гарантируем, что expensiveOperation(int param) вызывается не более одного раза для каждого уникального входного параметра. После создания получение значений может подвергаться свёртке констант JVM:
class Application {
private static final Map<Integer, Double> CACHE
= Map.ofLazy(Set.of(0, 1, 3, 42, 97), param -> expensiveOperation(param));
public static Optional<Double> cachedExpensiveOperation(int param) {
return Optional.ofNullable(CACHE.get(param));
}
private static double expensiveOperation(int param) {
// Calculate the value ...
}
// Eligible for constant folding
double val = cachedExpensiveOperation(42).orElseThrow();
}
Возвращённую Map<K, V> можно рассматривать как карту, основанную на поле Map<K, LazyConstant<V>>, где операция get(Object) эквивалентна следующему:
class LazyMap<K, V> extends AbstractMap<K, V> {
private final Map<K, LazyConstant<V>> backingMap;
public LazyMap(Set<K> keys, Function<K, V> computingFunction) {
this.backingMap = keys.stream()
.collect(Collectors.toUnmodifiableMap(
Function.identity(),
k -> LazyConstant.of(() -> computingFunction.apply(k))));
}
@Override
public V get(Object key) {
var lazyConstant = backingMap.get(key);
return lazyConstant == null
? null
: lazyConstant.get();
}
}
Значения в возвращённой карте могут подвергаться некоторым оптимизациям производительности, например свёртке констант, описанной в LazyConstant.
- Примечание по реализации:
- после успешной инициализации всех значений или их перехода в состояние ошибки сильная ссылка на функцию вычисления больше не хранится, и она может быть удалена сборщиком мусора.
- Параметры типа:
K— тип ключей, хранящихся в возвращённой картеV— тип отображаемых значений в возвращённой карте- Параметры:
-
keys— ключи (не равные null) возвращённой вычисляемой карты -
computingFunction— вызывается при первом обращении к соответствующему значению - Возвращает:
- новую карту с отложенным вычислением, используя предоставленный
keys - Исключения:
-
NullPointerException— если предоставленный наборkeysравенnull, если наборkeysсодержит элементnullили если предоставленныйcomputingFunctionравенnull - Начиная с версии:
- 26
- См. также:
© 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.
ofLazyтолько при включённых функциях предварительной версии.