Java 57: Map merge, computeIfAbsent & getOrDefault
easy⏱ 5 mincoursejava
merge: el idiom de contador
map.merge(key, 1, Integer::sum) significa: si key está ausente, pon 1; si está presente, reemplaza con oldValue + 1. La función de remapeo solo se llama cuando la clave ya existe. Esta única línea reemplaza map.put(k, map.getOrDefault(k, 0) + 1) y es el idiom canónico de contador de frecuencia.
Map<String,Integer> freq = new HashMap<>();
for (String w : words) freq.merge(w, 1, Integer::sum);
// {the=3, cat=2, sat=1}
computeIfAbsent: el idiom de multimap
map.computeIfAbsent(key, k -> new ArrayList<>()).add(value) crea la lista de forma lazy solo la primera vez que se ve una clave, luego la devuelve para que puedas hacer add. Es la forma estándar de construir un multimap Map<K, List<V>> sin un chequeo de null en cada inserción. La función de mapeo corre como mucho una vez por clave ausente.
getOrDefault, putIfAbsent, compute
getOrDefault(k, d) lee con un fallback sin mutar. putIfAbsent(k, v) escribe solo si está ausente y devuelve el valor existente si está presente. compute(k, (k,v) -> ...) siempre corre el remapeo (con v posiblemente null) y puede eliminar la entrada devolviendo null. computeIfPresent corre solo cuando la clave existe. Cada uno es una sola búsqueda atómica — importante bajo ConcurrentHashMap.
Contador de frecuencia + multimap
Dado the cat sat on the mat the cat, construye un Map de frecuencia de palabras usando merge(word, 1, sum); imprime los conteos ordenados por clave. Luego construye un multimap agrupando palabras por su longitud usando computeIfAbsent(len, () => []).push(word); imprime cada longitud y sus palabras. Confirma que the tiene conteo 3 y el grupo de longitud 3 contiene the, cat, sat, mat.
merge puede borrar al devolver null
Si una función de remapeo de merge o compute devuelve null, la entrada se elimina del map. Útil para contadores que decrementan a cero: map.merge(k, -1, (a, b) -> { int v = a + b; return v == 0 ? null : v; }) elimina la clave al llegar a cero — sin un paso de limpieza aparte.
Quiz: llamadas de la función de computeIfAbsent
Si llamas computeIfAbsent(k, mk) tres veces para la misma clave presente, ¿cuántas veces corre la función mk? Una — solo la primera vez, cuando la clave estaba ausente. Las otras dos devuelven el valor existente sin invocar mk. Eso lo hace la herramienta correcta para inicialización lazy.