我有以下地图:
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的人可以告诉我更好的方法吗?谢谢!
答案 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
表示,就可以使用它。