我需要修改下面给定地图中的键值 例如:
Map map= ["abcd":["name":"x", "age":"22"],"xyz":["name":"y", "age":"12"]]
需要修改键值,我的最终Map应如下所示:
Map map= ["modifiedkey":["name":"x", "age":"22"],"someanotherkey":["name":"y", "age":"12"]]
答案 0 :(得分:1)
您可以使用Groovy Collections API中的collectEntries
方法:
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
映射中没有定义映射,并且使用了默认映射 - 一个按原样返回密钥的闭包。我希望它有所帮助。