No puedo encontrar nada integrado ... pero usando ExpandoMetaClass puedo hacer esto:
ArrayList.metaClass.collectMap = {Closure callback->
def map = [:]
delegate.each {
def r = callback.call(it)
map[r[0]] = r[1]
}
return map
}
esto agrega el método collectMap a todas las ArrayLists ... No estoy seguro de por qué agregarlo a List o Collection no funcionó ... Supongo que eso es para otra pregunta ... pero ahora puedo hacer esto ...
assert ["foo":"oof", "42":"24", "bar":"rab"] ==
["foo", "42", "bar"].collectMap { return [it, it.reverse()] }
de la lista al mapa calculado con un cierre ... exactamente lo que estaba buscando.
Editar: la razón por la que no pude agregar el método a la Lista y Colección de interfaces fue porque no hice esto:
List.metaClass.enableGlobally()
después de esa llamada al método, puede agregar métodos a las interfaces ... lo que en este caso significa que mi método collectMap funcionará en rangos como este:
(0..2).collectMap{[it, it*2]}
que produce el mapa: [0: 0, 1: 2, 2: 4]