我找不到任何内置的东西......但使用 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 到带有一个闭包的计算 Map ......正是我想要的。
编辑:我无法将方法添加到接口 List 和 Collection 的原因是因为我没有这样做:
List.metaClass.enableGlobally()
在该方法调用之后,您可以将方法添加到接口。在这种情况下,这意味着我的 collectMap 方法将适用于这样的范围:
(0..2).collectMap{[it, it*2]}
生成地图: [0:0, 1:2, 2:4]