Não consigo encontrar nada integrado ... mas usando ExpandoMetaClass posso fazer isso:
ArrayList.metaClass.collectMap = {Closure callback->
def map = [:]
delegate.each {
def r = callback.call(it)
map[r[0]] = r[1]
}
return map
}
isso adiciona o método collectMap a todos os ArrayLists ... Não tenho certeza por que adicioná-lo a List ou Collection não funcionou. Acho que é outra questão ... mas agora posso fazer isso ...
assert ["foo":"oof", "42":"24", "bar":"rab"] ==
["foo", "42", "bar"].collectMap { return [it, it.reverse()] }
da lista ao mapa calculado com um fechamento ... exatamente o que eu estava procurando.
Editar: o motivo pelo qual não consegui adicionar o método às interfaces Lista e Coleção foi porque não fiz isso:
List.metaClass.enableGlobally()
após essa chamada de método, você pode adicionar métodos a interfaces .. o que, neste caso, significa que meu método collectMap funcionará em intervalos como este:
(0..2).collectMap{[it, it*2]}
que produz o mapa: [0: 0, 1: 2, 2: 4]