Я собираюсь инициализировать пустую карту динамически в 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
....