Как получить значение из Map со значением по умолчанию
Короткий ответ
getOrDefault() возвращает запасное значение, если ключа нет:
void main() {
var prices = Map.of("tea", 3, "cake", 12);
IO.println(prices.getOrDefault("tea", 0));
IO.println(prices.getOrDefault("coffee", 0));
}Результат:
3
0Добавить, если нет
putIfAbsent() записывает значение, только если ключа ещё нет:
void main() {
var settings = new HashMap<>(Map.of("theme", "dark"));
settings.putIfAbsent("theme", "light");
settings.putIfAbsent("lang", "en");
IO.println(new TreeMap<>(settings));
}Результат:
{lang=en, theme=dark}Создать при первом обращении
computeIfAbsent() создаёт значение только при необходимости. Удобно для группировки в списки:
void main() {
var byLetter = new TreeMap<Character, List<String>>();
for (String name : List.of("Anna", "Oleg", "Alex")) {
byLetter.computeIfAbsent(name.charAt(0), key -> new ArrayList<>()).add(name);
}
IO.println(byLetter);
}Результат:
{A=[Anna, Alex], O=[Oleg]}Частая ошибка
Использовать get() без проверки. Для отсутствующего ключа он возвращает null, и распаковка в int выбрасывает исключение:
void main() {
Map<String, Integer> stock = Map.of("tea", 5);
int coffee = stock.get("coffee");
}Результат:
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "java.lang.Integer.intValue()" because the return value of "java.util.Map.get(Object)" is nullФункции из этого ответа
- Map.getOrDefault() — Возвращает значение по ключу или запасное значение, если ключа нет.
- Map.computeIfAbsent() — Возвращает значение по ключу, создавая его функцией, если ключа нет.
- Map.putIfAbsent() — Записывает значение, только если ключа ещё нет.
- Map.get() — Возвращает значение по ключу или `null`.