添加两个地图的惯用/惯用方式,其中两个都可能为空

时间:2018-12-03 14:14:58

标签: dictionary groovy idiomatic

我有以下地图:

configs = [
    common : [
            foo : '123',
            bar : '456'
    ],
    dev : [
            foo : '789',
            bar : '012'
    ],
    test : null
]

当我将dev添加到common时,效果很好-common的值被dev的值覆盖。就是我想要的。

dev = configs['common'] + configs['dev']
println dev
// --> [foo:789, bar:012]

但是,如果我用test尝试同样的操作,则会出现以下错误:

  

groovy.lang.GroovyRuntimeException:方法java.util.LinkedHashMap#plus的方法重载不明确。   由于以下之间的原型重叠,无法解析为[null]调用的方法:       [接口java.util.Collection]       [接口java.util.Map]

我可以通过以下操作使其工作:

test = [:]
test = configs['common']==null ? test : test + configs['common']  // First add common bits
test = configs['test']==null ? test : test + configs['test']  // Then override with environment specific bits
println test
// --> [foo:123, bar:456]

但这看起来丑陋且肿。

具有更好Groovy-fu的人可以告诉我更好的方法吗?谢谢!

1 个答案:

答案 0 :(得分:1)

config['test'] == null时,您可以使用Elvis operator将空映射带到方程。考虑以下示例:

def configs = [
  common : [
    foo : '123',
    bar : '456'
  ],
  dev : [
    foo : '789',
    bar : '012'
  ],
  test : null
]


def dev = configs['common'] + (configs['dev'] ?: [:])
println dev

def test = configs['common'] + (configs['test'] ?: [:])
println test

输出:

[foo:789, bar:012]
[foo:123, bar:456]

只要您希望一个值可以由null表示,就可以使用它。