Как работает метод merge() у Map в Java?

«Как работает метод merge() у Map в Java?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Метод Map.merge() — это операция "объединения" (upsert) для пары ключ-значение. Он атомарно обрабатывает три случая: добавление нового ключа, обновление существующего или удаление записи.

Сигнатура: V merge(K key, V value, BiFunction<? super V, ? super V, ? extends V> remappingFunction)

Логика работы:

  1. Если ключ отсутствует в мапе, он добавляется с указанным value.
  2. Если ключ присутствует, вызывается функция remappingFunction. Она получает старое значение и новое (value) и возвращает результат для объединения.
  3. Если функция возвращает null, запись для этого ключа удаляется из мапы.

Примеры:

Map<String, Integer> scores = new HashMap<>();

// 1. Добавление нового ключа (функция не вызывается)
scores.merge("Alice", 10, (oldVal, newVal) -> oldVal + newVal);
System.out.println(scores); // {Alice=10}

// 2. Обновление существующего ключа (функция суммирует значения)
scores.merge("Alice", 5, Integer::sum);
System.out.println(scores); // {Alice=15}

// 3. Удаление записи (функция вернула null)
scores.merge("Alice", 0, (oldVal, newVal) -> null);
System.out.println(scores); // {}

Типичные сценарии использования:

  • Агрегация данных: Удобен для подсчета частот (слов, идентификаторов).
    Map<String, Integer> wordCount = new HashMap<>();
    for (String word : words) {
    wordCount.merge(word, 1, Integer::sum); // Увеличивает счетчик на 1
    }
  • Конкурентные структуры: В ConcurrentHashMap метод merge() является атомарной операцией.
  • Обновление сложных значений: Например, объединение списков или мап.

Важно: Функция объединения вызывается только если ключ уже существует.