Nie mogę znaleźć nic wbudowanego ... ale używając ExpandoMetaClass mogę to zrobić:
ArrayList.metaClass.collectMap = {Closure callback->
def map = [:]
delegate.each {
def r = callback.call(it)
map[r[0]] = r[1]
}
return map
}
to dodaje metodę collectMap do wszystkich ArrayLists ... Nie jestem pewien, dlaczego dodanie jej do Listy lub Kolekcji nie zadziałało .. Myślę, że to inne pytanie ... ale teraz mogę to zrobić ...
assert ["foo":"oof", "42":"24", "bar":"rab"] ==
["foo", "42", "bar"].collectMap { return [it, it.reverse()] }
z listy do obliczonej mapy z jednym zamknięciem ... dokładnie to, czego szukałem.
Edycja: powodem, dla którego nie mogłem dodać metody do listy i kolekcji interfejsów, było to, że nie zrobiłem tego:
List.metaClass.enableGlobally()
po wywołaniu metody możesz dodać metody do interfejsów .. co w tym przypadku oznacza, że moja metoda collectMap będzie działać na zakresach takich jak ten:
(0..2).collectMap{[it, it*2]}
co daje mapę: [0: 0, 1: 2, 2: 4]