需要修改一个Groovy地图
问题描述:
键列表,我需要从给定的地图修改下面 例键值:需要修改一个Groovy地图
Map map= ["abcd":["name":"x", "age":"22"],"xyz":["name":"y", "age":"12"]]
需要修改的键值和我最后的地图应该有如下:
Map map= ["modifiedkey":["name":"x", "age":"22"],"someanotherkey":["name":"y", "age":"12"]]
答
您可以使用从Groovy Collections APIcollectEntries
方法:
def defaultTransformation = { String key -> key }
def basicTransformation = { String key -> key.toUpperCase().reverse()
Map transformations = [abcd: basicTransformation, xyz: basicTransformation]
Map map= ["abcd":["name":"x", "age":"22"],"xyz":["name":"y", "age":"12"], "unchanged": ["name": "a", "age": "20"]]
Map newMap = map.collectEntries { [(transformations.getOrDefault(it.key, defaultTransformation).call(it.key)): it.value] }
在上面的示例中,我使用定义转换的Closure
- 它期望从当前映射条目关键字取得的单个String
参数。正如你所看到的,Groovy中的Closure是一等公民,所以我们可以将它作为例如。地图中的值。对于这个例子,我创建了transformations
映射,该映射定义了从旧密钥到新密钥的映射。我也创建了defaultTransformation
闭包 - 它将被用于映射transformations
映射给定的键不存在。
运行下面的脚本将产生newMap
像这样的:
[DCBA:[name:x, age:22], ZYX:[name:y, age:12], unchanged:[name:a, age:20]]
正如你可以看到:
-
abcd
关键是用basicTransformation
关闭 -
xyz
关键是用basicTransformation
关闭也转化转化 -
unchanged
键保持不变,因为在transformations
映射中没有映射定义,并且使用了默认映射 - 一个按原样返回键的闭包。
我希望它有帮助。
嗨, 感谢您的回答, 我需要动态修改密钥,就像需要获取旧密钥“abcd”并用一些函数修改密钥(例如:trim或substring并且此密钥应该是地图的新关键 – Raju
@Raju感谢您提供更多的细节我已经更新了我的答案'Closure'支持使用Groovy闭包定义转换函数 –
@Raju请将这些要求添加到问题中。你想要一个简单的映射 – cfrick