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