我找不到内置的任何内容...但是使用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]