Esto debería funcionar para cualquier número de mapas:
def maps = [[a: 1, b: 2], [b:1, c:3]]
def result = [:].withDefault{0}
maps.collectMany{ it.entrySet() }.each{ result[it.key] += it.value }
assert result == [a: 1, b: 3, c: 3]
La expresión maps.collectMany{ it.entrySet() }
devuelve una lista de entradas de mapa, como [a=1, b=2, b=1, c=3]
, y luego cada uno de ellos se agrega al resultado.
Otra opción, si desea mantener toda la transformación en una expresión y hacerla "más funcional", es agrupar primero las entradas por clave y luego sumar los valores, pero creo que es menos legible:
def result = maps.collectMany{ it.entrySet() }
.groupBy{ it.key }
.collectEntries{[it.key, it.value.sum{ it.value }]}
la parte groupBy
devuelve un mapa de la forma [a:[a=1], b:[b=2, b=1], c:[c=3]]
y luego los collectEntries
transformaciones que el mapa en otra que tiene el mismo kays pero tiene la suma de las listas en los valores en su lugar.
creo que proporciona un método completo con una buena firma como el segundo ejemplo (en lugar de la expresión lanzada en el aire) realmente agrega un poco a la calidad general de la respuesta, porque así es como deberíamos escribir este tipo de cosas en código "real" si nos preocupamos por la calidad del código. +1 = D – epidemian