在Groovy中使用递归嵌套映射合并映射
我想知道是否有人可以轻松地将2个深嵌套地图合并在一起?
例如,我想得到:
[ "a" : "1", "animals" : ["cat" : "blue"] ] + [ "b" : 2, "animals" : ["dog" : "red"] ] == [ "a" : 1, "b" : 2, "animals" : [ "cat" : "blue", "dog" : "red"] ]
有人有简单的解决方案吗?
您可以使用递归为Map
编写一个:
Map.metaClass.addNested = { Map rhs -> def lhs = delegate rhs.each { k, v -> lhs[k] = lhs[k] in Map ? lhs[k].addNested(v) : v } lhs } def map1 = [ "a" : "1", "animals" : ["cat" : "blue"] ] def map2 = [ "b" : 2, "animals" : ["dog" : "red"] ] assert map1.addNested( map2 ) == [ a: '1', animals: [cat: 'blue', dog: 'red'], b: 2 ]
我有一个与@dmahapatro类似的解决方案,但是使用带有可变参数的方法:
def m1 = [a: 1, animals: [cat: 'blue']] def m2 = [b: 2, animals: [dog: 'red']] Map merge(Map... maps) { Map result if (maps.length == 0) { result = [:] } else if (maps.length == 1) { result = maps[0] } else { result = [:] maps.each { map -> map.each { k, v -> result[k] = result[k] instanceof Map ? merge(result[k], v) : v } } } result } assert [:] == merge() assert m1 == merge(m1) assert [a:1, b:2, animals:[cat:'blue', dog:'red']] == merge(m1, m2)
仅供参考,现在可以开箱即用,你可以使用’加’或’+’:
def map1 = [p1:100, p2:200, p5: [a:"x"]] def map2 = [p2: 1, p3:300, p4:400, p5: [a:"y"]] def map3 = map1 + map2 def map4 = map1.plus(map2) assert map3 == [p1:100, p2:1, p5:[a:'y'], p3:300, p4:400] assert map3 == map4
- Selenium UnreachableBrowserException – SoapUI中的“无法启动新会话”Groovy TestStep
- 如何在Java / Groovy中将InputStream转换为BufferedImage?
- Grails或Play如何检测更改和热重载类?
- 在groovy中排序地图
- 从groovy中访问一个java类
- 使用Groovy(或Java)如何将org.joda.time.LocalDateTime转换为java.util.date?
- 是否可以将包中的所有类注册为Spring bean
- 如何拦截从Java到Groovy的调用 – 或者轻松地模拟它
- Grails – 无法从Controller调用服务 – >总是得到“无法调用null对象上的方法错误”