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