Перейти к основному содержимому

Метод Map.computeIfAbsent()

· 2 мин. чтения

1. Обзор

В этом уроке мы кратко рассмотрим новый метод по умолчанию calculateIfAbsent интерфейса Map , представленный в Java 8.

В частности, мы рассмотрим его сигнатуру, использование и то, как он обрабатывает различные случаи.

2. Метод Map.computeIfAbsent

Начнем с сигнатуры calculateIfAbsent :

default V computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction)

Метод calculateIfAbsent принимает два параметра. Первый параметр — это ключ , а второй параметр — это функция отображения. Важно знать, что функция сопоставления вызывается только в том случае, если сопоставление отсутствует.

2.1. Ключ, связанный с ненулевым значением

Во-первых, он проверяет, присутствует ли ключ в карте. Если ключ присутствует и с ключом связано ненулевое значение, то он возвращает это значение:

Map<String, Integer> stringLength = new HashMap<>();
stringLength.put("John", 5);
assertEquals((long)stringLength.computeIfAbsent("John", s -> s.length()), 5);

Как мы видим, у ключа «John» присутствует ненулевое отображение, оно возвращает значение 5. Если бы использовалась наша функция отображения, мы ожидали бы, что функция вернет длину 4.

2.2. Использование функции отображения для вычисления значения

Кроме того, если ключ отсутствует на карте или с ключом связано нулевое значение, то он пытается вычислить значение, используя заданную функцию отображения . Кроме того, он вводит вычисленное значение на карту, если вычисленное значение не равно нулю.

Давайте посмотрим на использование функции отображения в методе calculateIfAbsent :

Map<String, Integer> stringLength = new HashMap<>();
assertEquals((long)stringLength.computeIfAbsent("John", s -> s.length()), 4);
assertEquals((long)stringLength.get("John"), 4);

Поскольку ключ «Джон» отсутствует, он вычисляет значение, передавая ключ в качестве параметра функции сопоставления .

2.3. Функция сопоставления возвращает null

Кроме того, если функция mappingFunction возвращает null , карта не записывает сопоставление:

Map<String, Integer> stringLength = new HashMap<>();
assertEquals(stringLength.computeIfAbsent("John", s -> null), null);
assertNull(stringLength.get("John"));

2.4. Функция сопоставления выдает исключение

Наконец, если функция mappingFunction выдает непроверенное исключение, то это исключение выбрасывается повторно, и карта не записывает сопоставление:

@Test(expected = RuntimeException.class)
public void whenMappingFunctionThrowsException_thenExceptionIsRethrown() {
Map<String, Integer> stringLength = new HashMap<>();
stringLength.computeIfAbsent("John", s -> { throw new RuntimeException(); });
}

Мы видим, что функция mappingFunction выдает исключение RuntimeException , которое распространяется обратно на метод calculateIfAbsent .

3. Заключение

В этой быстрой статье мы рассмотрели метод calculateIfAbsent , его сигнатуру и использование. Наконец, мы увидели, как он обрабатывает разные случаи.

Как всегда, все эти примеры кода доступны на GitHub .