2017-08-07 62 views
1

鍵列表,我需要從給定的地圖修改下面 例鍵值:需要修改一個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"]] 

回答

1

您可以使用從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