我找不到任何内置的东西...但是使用ExpandoMetaClass,我可以做到这一点:
ArrayList.metaClass.collectMap = {Closure callback->
def map = [:]
delegate.each {
def r = callback.call(it)
map[r[0]] = r[1]
}
return map
}
这将为所有ArrayList添加collectMap方法...我不确定为什么将其添加到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]