1. Обзор
В этом уроке мы кратко рассмотрим новый метод по умолчанию computeIfAbsent интерфейса Map , введенного в Java 8.
В частности, мы рассмотрим его подпись, использование и то, как он обрабатывает различные случаи.
2. Map.computeIfAbsent Метод
Давайте начнем с рассмотрения подписи computeIfAbsent :
default V computeIfAbsent(K key, Function super K, ? extends V> mappingFunction)
Метод computeIfAbsent принимает два параметра. Первый параметр-это ключ , а второй параметр-функция отображения . Важно знать, что функция отображения вызывается только в том случае, если отображение отсутствует.
2.1. Ключ, связанный с ненулевым значением
Во-первых, он проверяет, присутствует ли ключ | на карте. Если ключ присутствует и ненулевое значение связано с ключом, то он возвращает это значение:
MapstringLength = new HashMap<>(); stringLength.put("John", 5); assertEquals((long)stringLength.computeIfAbsent("John", s -> s.length()), 5);
Как мы видим, ключ “John” имеет ненулевое отображение, оно возвращает значение 5. Если бы использовалась наша функция отображения, мы ожидали бы, что функция вернет длину 4.
2.2. Использование функции отображения для вычисления значения
Кроме того, если ключ отсутствует на карте или нулевое значение связано с ключом, затем он пытается вычислить значение с помощью заданной функции отображения . Кроме того, он вводит вычисленное значение в карту, если только вычисленное значение не равно нулю.
Давайте рассмотрим использование функции mapping в методе computeIfAbsent :
MapstringLength = new HashMap<>(); assertEquals((long)stringLength.computeIfAbsent("John", s -> s.length()), 4); assertEquals((long)stringLength.get("John"), 4);
Поскольку ключ “John” отсутствует, он вычисляет значение, передавая ключ | в качестве параметра функции mapping|/.
2.3. Функция Отображения Возвращает Значение null
Кроме того, если функция mapping возвращает null , карта не записывает никакого отображения:
MapstringLength = new HashMap<>(); assertEquals(stringLength.computeIfAbsent("John", s -> null), null); assertNull(stringLength.get("John"));
2.4. Функция отображения выдает исключение
Наконец, если функция mapping выдает непроверенное исключение, то исключение генерируется повторно, и карта не записывает никакого сопоставления:
@Test(expected = RuntimeException.class) public void whenMappingFunctionThrowsException_thenExceptionIsRethrown() { MapstringLength = new HashMap<>(); stringLength.computeIfAbsent("John", s -> { throw new RuntimeException(); }); }
Мы видим , что функция mapping вызывает исключение RuntimeException , которое распространяется обратно на метод computeIfAbsent .
3. Заключение
В этой краткой статье мы рассмотрели метод computeIfAbsent , его сигнатуру и его использование. Наконец, мы увидели, как он справляется с различными случаями.
Как всегда, все эти примеры кода доступны на GitHub .