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']]是的,你是对的