Je ne trouve rien de intégré ... mais en utilisant 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 les ArrayLists ... Je ne sais pas pourquoi l'ajout à List ou Collection n'a pas fonctionné ... Je suppose que c'est 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 cherchais.
Edit: la raison pour laquelle je n'ai pas pu ajouter la méthode à la liste des interfaces et à la collection était parce que je ne l'ai pas fait:
List.metaClass.enableGlobally()
après cet appel de méthode, vous pouvez ajouter des méthodes aux interfaces .. ce qui dans ce cas signifie que ma méthode collectMap fonctionnera sur des plages comme celle-ci:
(0..2).collectMap{[it, it*2]}
ce qui donne la carte: [0: 0, 1: 2, 2: 4]