Путаница в отношении переназначения карты с помощью getOrDefault в Groovy - PullRequest
0 голосов
/ 06 августа 2020

Я собираюсь инициализировать пустую карту динамически в al oop, т.е. key1 и key2 - переменные в l oop:

Map<String, Map<String, List>> m = [
    key1: [
        key2: []
    ]
]

Я пытаюсь инициализировать структура карты getOrDefault, и она работает следующим образом:

Map a = [:]
a = a.getOrDefault("b", ["b": [:]]).getOrDefault("c", [ "b": [ "c": []]])
println """
              a ~> ${a}
         a['b'] ~> ${a['b']}
    a['b']['c'] ~> ${a['b']['c']}
            a.b ~> ${a.b}
          a.b.c ~> ${a.b.c}
"""

===> output:

              a ~> [b:[c:[]]]
         a['b'] ~> [c:[]]
    a['b']['c'] ~> []
            a.b ~> [c:[]]
          a.b.c ~> []

Однако, когда я попытался использовать переменную вместо String ('b', 'c'), похоже, не получается получить структуру:

Map x = [:]
String b = 'b'
String c = 'c'
x = x.getOrDefault("${b}", ["${b}": [:]]).getOrDefault("${c}", [ "${b}": [ "${c}": []]])
println """x ~> ${x}"""
println 'x.get("${b}") ~~> ' + """ ${x.get("${b}")} """
println 'x.get("${b}").get("${c}") ~>' + """  ${x.get("${b}").get("${c}")} """
println 'x["${b}"] ~>' + """ ${x["${b}"]} """
println 'x["${b}"]["${c}"] ~>' + """ ${x["${b}"]["${c}"]}"""

===> вывод:

x ~> [b:[c:[]]]
x.get("${b}") ~~>  [c:[]] 
x.get("${b}").get("${c}") ~>  [] 
x["${b}"] ~> null 
Exception thrown

java.lang.NullPointerException: Cannot get property 'c' on null object
    at assign-2nd-map.run(assign-2nd-map.groovy:26)

Я действительно не понимаю, почему x.get("${b}") работает, но x["${b}"] получил null

кстати, вот подробности инициализации карты Dynami c:

Map m = [
    'x' : [
        'name': 'x',
        'size': ['1', '2'],
        'age': '1',
    ],
    'y': [
        'name': 'x',
        'size': ['2', '3'],
        'age': '2'
    ]
]
Map a = [:]
m.each{ k, v ->
    v.size.each {
        String t = "${v.name}-${it}"
        a = a.getOrDefault(t, ["${t}": [:]])
        println """
            t: ${t}
            k: ${k}
            a: ${a}
            a.t: ${a.t}
            a.get("${t}"): ${a.get("${t}")}
            a["${t}"]: ${a["${t}"]}
        """
    }
}

=== output:


            t: x-1
            k: x
            a: [x-1:[:]]
            a.t: null
            a.get("x-1"): [:]
            a["x-1"]: null
        

            t: x-2
            k: x
            a: [x-2:[:]]
            a.t: null
            a.get("x-2"): [:]
            a["x-2"]: null
     ....
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...