Я не можу знайти нічого вбудованого ... але за допомогою ExpandoMetaClass я можу це зробити:
ArrayList.metaClass.collectMap = {Closure callback->
def map = [:]
delegate.each {
def r = callback.call(it)
map[r[0]] = r[1]
}
return map
}
це додає метод collectionMap до всіх ArrayLists ... я не впевнений, чому додавання його до списку чи колекції не спрацювало. Я думаю, це вже з іншого питання ... але тепер я можу це зробити ...
assert ["foo":"oof", "42":"24", "bar":"rab"] ==
["foo", "42", "bar"].collectMap { return [it, it.reverse()] }
зі списку до розрахункової карти з одним закриттям ... саме те, що я шукав.
Редагувати: причиною того, що я не зміг додати метод до списку інтерфейсів та колекції, було те, що я цього не робив:
List.metaClass.enableGlobally()
після цього виклику методу ви можете додати методи до інтерфейсів .. що в цьому випадку означає, що мій метод collectionMap буде працювати в таких діапазонах:
(0..2).collectMap{[it, it*2]}
який дає карту: [0: 0, 1: 2, 2: 4]