Yerleşik bir şey bulamıyorum ... ama ExpandoMetaClass kullanarak bunu yapabilirim:
ArrayList.metaClass.collectMap = {Closure callback->
def map = [:]
delegate.each {
def r = callback.call(it)
map[r[0]] = r[1]
}
return map
}
bu, CollectMap yöntemini tüm ArrayListlere ekler ... Bunu Listeye veya Koleksiyona eklemenin neden işe yaramadığından emin değilim .. Sanırım bu başka bir soru için ... ama şimdi bunu yapabilirim ...
assert ["foo":"oof", "42":"24", "bar":"rab"] ==
["foo", "42", "bar"].collectMap { return [it, it.reverse()] }
Listeden hesaplanmış haritaya tek bir kapanışla ... tam olarak aradığım şey.
Düzenleme: Yöntemi arayüzler Listesine ve Koleksiyona ekleyemememin nedeni, bunu yapmamış olmamdı:
List.metaClass.enableGlobally()
bu yöntem çağrısından sonra, arabirimlere yöntemler ekleyebilirsiniz .. Bu durumda, CollectMap yöntemimin aşağıdaki gibi aralıklarda çalışacağı anlamına gelir:
(0..2).collectMap{[it, it*2]}
bu haritayı verir: [0: 0, 1: 2, 2: 4]