需要修改Groovy Map中的键列表

时间:2017-08-07 12:16:21

标签: groovy

我需要修改下面给定地图中的键值 例如:

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"]] 

1 个答案:

答案 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映射中没有定义映射,并且使用了默认映射 - 一个按原样返回密钥的闭包。

我希望它有所帮助。