Слияние значений в карте в Java
Метод merge на карте вставляет значение, если
ключа не было, иначе передает старое и новое в
функцию слияния. Так проще суммировать счетчики и
собирать агрегаты без ручного get.
Родственный putIfAbsent кладет пару только
при отсутствии ключа и возвращает уже лежащее
значение или null. merge всегда
участвует в решении, когда ключ занят.
Сумма заказов по клиенту при нескольких строках входа:
import java.util.HashMap;
import java.util.Map;
public class Main {
public static void main(String[] args) {
Map<String, Integer> totals = new HashMap<>();
record Line(String client, int sum) {}
for (Line line : new Line[] {
new Line("acme", 100),
new Line("acme", 50),
new Line("beta", 20)
}) {
totals.merge(line.client(), line.sum(), Integer::sum);
}
System.out.println(totals);
}
}
Для "acme" получится 150, для
"beta" останется 20. Если функция
слияния вернет null, пара удалится из карты:
import java.util.HashMap;
import java.util.Map;
public class Main {
public static void main(String[] args) {
Map<String, String> tags = new HashMap<>();
tags.put("id", "1");
tags.merge("id", "2", (oldVal, newVal) -> oldVal + "," + newVal);
System.out.println(tags.get("id"));
}
}
Сложите три вставки одного ключа "x" со
значениями 4, 6, 10 и
выведите итог.