Groovy 我想把两张地图合并成一张合成地图
我定义了以下地图Groovy 我想把两张地图合并成一张合成地图,groovy,Groovy,我定义了以下地图 def Map1 = [ Rate: 0, Exceptions: [ Exceptions: [ [:] ] ] def Map2 = [ Exceptions: [Exceptions: [ [:] ] ] ] Map1已经有数据了 Map1 = [ Rate: 0, Exceptions: [
def Map1 = [
Rate: 0,
Exceptions: [ Exceptions: [ [:] ]
]
def Map2 = [
Exceptions: [Exceptions: [ [:] ] ]
]
Map1已经有数据了
Map1 = [
Rate: 0,
Exceptions: [
Exception: [
[Code: 5, Message: "Error"],
[Code: 65, Message: "Error"],
[Code: 35, Message: "Error"]
]
]
]
我想把Map2添加到Map1中
Map2 = [
Exceptions: [
Exception: [
[Code: 6, Message: "Error"],
[Code: 25, Message: "Error"],
[Code: 15, Message: "Error"]
]
]
]
我知道我可以做一个
Map2.Exceptions.Exception.each{ Exception ->
Map1.Exceptions.Exception.add(Exception)
}
但有没有办法让Groovy做到这一点?i、 e.Map1.合并(Map2)
编辑:我最终创建了一个元类方法来处理合并。它是递归的,不处理任何已经存在的非映射/列表变量,但它做了我需要它做的事情
Map.metaClass.Merge = { Map Source ->
Map Destination = delegate
Source.keySet().each{ key ->
if(Destination.keySet().contains(key)){
if(!(Source[key] instanceof Map)){
if(Source[key] instanceof List){
Source[key].each{ Value ->
Destination[key].add(Value)
}//Source[Key].each
}//if(Source[key] instanceof List)
}//if(!(Source[key] instanceof Map))
else{
Destination[key].Merge(Source[key])
}//else(!(Source[key] instanceof Map))
}//if(Destination.keySet().contains(key))
else{
Destination[key] = Source[key]
}//else(Destination.keySet().contains(key))
}//Source.keySet().each
}//Map.metaclass.Merge(Map Source)
也许是这样
Map1.Exceptions.Exception += Map2.Exceptions.Exception
print Map1
输出:
[Rate:0, Exceptions:[Exception:[[Code:5, Message:Error], [Code:65, Message:Error], [Code:35, Message:Error], [Code:6, Message:Error], [Code:25, Message:Error], [Code:15, Message:Error]]]]
据我所知并非如此,因为它非常依赖于地图的结构和所需的功能。最接近的是
(map1作为ConfigObject)。merge(map2作为ConfigObject)
,但这不是您所需的功能,因为您的map2异常值需要添加到map1异常列表中,而不是像默认值那样覆盖它。在开始使用扩展Map类的方法之前,我希望看到您的响应。哦,好吧。谢谢。我的回答只适用于这种特殊情况。例如,Map1.Exceptions+=Map2.Exceptions将不起作用,因为它只包含Map2.Exceptions的元素。如果你能保证这个结构总是像你的例子中那样,我的回答会起作用,但是你的每个闭包也会起作用。所以,也许你没有白白做所有的工作:)如果我没有弄错的话,那么这将只在地图结构的第一层工作。对于嵌套结构,当第二个映射仅部分填充时,此方法将失败。[foo:aaa',bar:[buzz:bbb',qux:ccc']+[bar:[buzz:ddd']==[foo:aaa,bar:[buzz:ddd']]是的,你是对的