В Java метод computeIfAbsent— это мощная функция, представленная в Java 8, которая позволяет разработчикам обрабатывать отсутствие значения на карте и вычислять новое значение на лету. Этот метод особенно полезен при работе с коллекциями, такими как HashMap или ConcurrentHashMap, и обеспечивает краткий способ обработки условной логики и предотвращения ненужных проверок на null. В этой статье блога мы подробно рассмотрим метод computeIfAbsent, обсудим его назначение и предоставим примеры кода, демонстрирующие его использование.
Понимание метода ComputeIfAbsent:
Метод computeIfAbsentопределен в интерфейсе Mapв Java и имеет следующую сигнатуру:
default V computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction)
Этот метод принимает в качестве аргументов ключ и функцию сопоставления. Если указанный ключ присутствует в карте, метод возвращает соответствующее значение. Однако если ключ не найден, вызывается функция сопоставления для вычисления нового значения, которое затем связывается с ключом и возвращается.
Пример 1. Использование ComputeIfAbsent с HashMap
Давайте рассмотрим сценарий, в котором у нас есть HashMap, который хранит количество вхождений каждого символа в строку.
import java.util.HashMap;
import java.util.Map;
public class ComputeIfAbsentExample {
public static void main(String[] args) {
String input = "Hello, World!";
Map<Character, Integer> charCountMap = new HashMap<>();
for (char c : input.toCharArray()) {
charCountMap.computeIfAbsent(c, k -> 0);
charCountMap.put(c, charCountMap.get(c) + 1);
}
System.out.println(charCountMap);
}
}
Выход:
{H=1, e=1, l=3, o=2, ,=1, W=1, r=1, d=1, !=1}
В приведенном выше примере мы используем метод computeIfAbsent, чтобы гарантировать, что каждый символ присутствует на карте в качестве ключа с начальным значением 0. Затем мы увеличиваем счетчик для каждого символа на один.
Пример 2. Использование ComputeIfAbsent с ConcurrentHashMap
Метод computeIfAbsentтакже применим к параллельным коллекциям, таким как ConcurrentHashMap, который обеспечивает потокобезопасные операции.
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
public class ComputeIfAbsentConcurrentExample {
public static void main(String[] args) {
ConcurrentMap<String, Integer> wordCountMap = new ConcurrentHashMap<>();
String[] words = {"apple", "banana", "apple", "cherry", "banana", "apple"};
for (String word : words) {
wordCountMap.computeIfAbsent(word, k -> 0);
wordCountMap.put(word, wordCountMap.get(word) + 1);
}
System.out.println(wordCountMap);
}
}
Выход:
{apple=3, cherry=1, banana=2}
В этом примере мы используем метод computeIfAbsentдля инициализации счетчика каждого слова равным 0 в ConcurrentHashMap. Затем мы увеличиваем счетчик для каждого слова на единицу.
Метод computeIfAbsentв Java — это универсальный инструмент, который упрощает условную логику при работе с картами. Это позволяет разработчикам обрабатывать отсутствие значения на карте и вычислять новое значение на лету. Используя концепции функционального программирования, Java 8 представила краткий и выразительный способ работы с картами. В этой статье мы рассмотрели метод computeIfAbsent, предоставили примеры кода с использованием HashMap и ConcurrentHashMap и продемонстрировали, как его можно использовать для решения реальных проблем.