Идиоматический / Groovy способ добавить две карты, каждая из которых может быть нулевой - PullRequest
0 голосов
/ 03 декабря 2018

У меня есть следующая карта:

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] из-за перекрывающихся прототипов между: [interface java.util.Collection] [interface 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 голосов
/ 03 декабря 2018

Вы можете использовать оператор Элвиса , чтобы привести пустую карту к уравнению при config['test'] == null.Рассмотрим следующий пример:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...