Je ne trouve rien construit ... mais en utilisant le ExpandoMetaClass je peux le faire:
ArrayList.metaClass.collectMap = {Closure callback->
def map = [:]
delegate.each {
def r = callback.call(it)
map[r[0]] = r[1]
}
return map
}
cela ajoute la méthode collectMap à tous ArrayLists ... Je ne sais pas pourquoi l'ajouter Liste ou Collection ne fonctionne pas .. Je suppose que ce pour une autre question ... mais maintenant je peux le faire ...
assert ["foo":"oof", "42":"24", "bar":"rab"] ==
["foo", "42", "bar"].collectMap { return [it, it.reverse()] }
de la liste à la carte calculée avec une fermeture ... exactement ce que je à la recherche de.
Edit: la raison pour laquelle je ne pouvais pas ajouter la méthode à la liste des interfaces et collection a été parce que je ne le fais pas:
List.metaClass.enableGlobally()
après appel de méthode, vous pouvez ajouter des méthodes aux interfaces .. qui dans ce cas signifie que ma méthode collectMap fonctionnera sur les gammes comme ceci:
(0..2).collectMap{[it, it*2]}
qui donne la carte: [0: 0, 1: 2, 2: 4]
commentaire de Amir est maintenant bonne réponse: http://stackoverflow.com/a/4484958/27561 –