Ich kann nichts Eingebautes finden ... aber mit der ExpandoMetaClass kann ich Folgendes tun:
ArrayList.metaClass.collectMap = {Closure callback->
def map = [:]
delegate.each {
def r = callback.call(it)
map[r[0]] = r[1]
}
return map
}
Dadurch wird die Methode collectMap zu allen ArrayLists hinzugefügt. Ich bin mir nicht sicher, warum das Hinzufügen zu List oder Collection nicht funktioniert hat. Ich denke, das ist eine andere Frage. Aber jetzt kann ich das tun.
assert ["foo":"oof", "42":"24", "bar":"rab"] ==
["foo", "42", "bar"].collectMap { return [it, it.reverse()] }
Von der Liste zur berechneten Karte mit einem Abschluss ... genau das, wonach ich gesucht habe.
Bearbeiten: Der Grund, warum ich die Methode nicht zu den Schnittstellen Liste und Sammlung hinzufügen konnte, war, dass ich dies nicht getan habe:
List.metaClass.enableGlobally()
Nach diesem Methodenaufruf können Sie Schnittstellen Methoden hinzufügen. In diesem Fall bedeutet dies, dass meine collectMap-Methode für Bereiche wie diesen funktioniert:
(0..2).collectMap{[it, it*2]}
was die Karte ergibt: [0: 0, 1: 2, 2: 4]