Ответ
Метод Map.merge() — это операция "объединения" (upsert) для пары ключ-значение. Он атомарно обрабатывает три случая: добавление нового ключа, обновление существующего или удаление записи.
Сигнатура: V merge(K key, V value, BiFunction<? super V, ? super V, ? extends V> remappingFunction)
Логика работы:
- Если ключ отсутствует в мапе, он добавляется с указанным
value. - Если ключ присутствует, вызывается функция
remappingFunction. Она получает старое значение и новое (value) и возвращает результат для объединения. - Если функция возвращает
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()является атомарной операцией. - Обновление сложных значений: Например, объединение списков или мап.
Важно: Функция объединения вызывается только если ключ уже существует.