Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Как получить значение из 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`.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.