需要修改一个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映射中没有映射定义,并且使用了默认映射 - 一个按原样返回键的闭包。

我希望它有帮助。

+0

嗨, 感谢您的回答, 我需要动态修改密钥,就像需要获取旧密钥“abcd”并用一些函数修改密钥(例如:trim或substring并且此密钥应该是地图的新关键 – Raju

+0

@Raju感谢您提供更多的细节我已经更新了我的答案'Closure'支持使用Groovy闭包定义转换函数 –

+1

@Raju请将这些要求添加到问题中。你想要一个简单的映射 – cfrick