Map.merge()
Добавляет значение по ключу или объединяет его с уже существующим.
Доступно с: Java 8
Синтаксис
default V merge(K key, V value, BiFunction<? super V, ? super V, ? extends V> remappingFunction)Параметры
| Параметр | Тип | Описание |
|---|---|---|
| key | K | Ключ. |
| value | V | Значение, если ключа нет, и второй аргумент функции, если есть. |
| remappingFunction | BiFunction<? super V, ? super V, ? extends V> | Объединяет старое и новое значение; результат `null` удаляет ключ. |
Возвращаемое значение
VНовое значение ключа или `null`, если ключ удалён.
Примеры
Подсчёт повторов:
void main() {
Map<String, Integer> counts = new TreeMap<>();
for (String fruit : List.of("apple", "pear", "apple", "kiwi", "apple")) {
counts.merge(fruit, 1, Integer::sum);
}
IO.println(counts);
}Результат:
{apple=3, kiwi=1, pear=1}Сумма продаж по менеджерам:
void main() {
record Sale(String who, double amount) {}
var sales = List.of(new Sale("Anna", 120.5), new Sale("Oleg", 80), new Sale("Anna", 30));
Map<String, Double> totals = new TreeMap<>();
for (Sale s : sales) {
totals.merge(s.who(), s.amount(), Double::sum);
}
IO.println(totals);
}Результат:
{Anna=150.5, Oleg=80.0}Примечания
Если ключа нет, записывается value; если есть — результат функции от старого и нового значения. Это самый короткий способ вести счётчики и суммы. Функция, вернувшая null, удаляет ключ.
См. также
- Map.getOrDefault() — Возвращает значение по ключу или запасное значение, если ключа нет.
- Map.computeIfAbsent() — Возвращает значение по ключу, создавая его функцией, если ключа нет.
- Collectors.counting() — Сборщик-счётчик; обычно используется внутри `groupingBy()`.
Вопросы и ответы по теме
В учебнике
- Словари: Map и HashMap — Словари Map в Java: пары ключ — значение, put и get, getOrDefault, подсчёт с merge, TreeMap и LinkedHashMap.