«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);

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

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

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

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

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

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

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

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

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

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

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