Non riesco a trovare nulla di integrato ... ma usando ExpandoMetaClass posso farlo:
ArrayList.metaClass.collectMap = {Closure callback->
def map = [:]
delegate.each {
def r = callback.call(it)
map[r[0]] = r[1]
}
return map
}
questo aggiunge il metodo collectMap a tutti gli ArrayList ... Non sono sicuro del motivo per cui aggiungerlo a List o Collection non ha funzionato .. Immagino sia per un'altra domanda ... ma ora posso farlo ...
assert ["foo":"oof", "42":"24", "bar":"rab"] ==
["foo", "42", "bar"].collectMap { return [it, it.reverse()] }
dalla Lista alla Mappa calcolata con una chiusura ... esattamente quello che stavo cercando.
Modifica: il motivo per cui non ho potuto aggiungere il metodo all'elenco e alla raccolta delle interfacce era perché non l'ho fatto:
List.metaClass.enableGlobally()
dopo quella chiamata al metodo, puoi aggiungere metodi alle interfacce .. il che in questo caso significa che il mio metodo collectMap funzionerà su intervalli come questo:
(0..2).collectMap{[it, it*2]}
che restituisce la mappa: [0: 0, 1: 2, 2: 4]