Sto cercando un modo elegante per ottenere e inserire valori in mappe nidificate e non tipizzate in Java.
Ad esempio supponendo che abbia una struttura della mappa come segue:
Map m = {
"a": {
"aa" : {
"aaa": "hello",
"aab": "world"
},
"ab" : { ... }
},
"b": {
...
}
}
In Groovy posso accedere a questi valori in modo semplice come:
m.a.aa.aab
e persino impostare / inserire valori come
m.a.aa.aab = "univers"
mentre sono in Java, sono costretto a scrivere qualcosa del genere per ottenere il valore
((Map)((Map)m.get("a")).get("aa")).get("aab")
e per impostare il valore che avrei bisogno di scrivere
((Map)((Map)m.get("a")).get("aa")).put("aab", "univers")
Ci sono modi migliori / librerie per fare questo? L'unica cosa che posso pensare è scrivere alcuni metodi di supporto come
public static Object getValueForKeyPath(Map map, List<String> keys) {
if (keys.size() == 1) {
return map.get(keys.get(0));
} else {
return getValueForKeyPath((Map) map.get(keys.get(0)), keys.subList(1, keys.size()));
}
}
public static void setValueForKeyPath(Map map, List<String> keys, Object value) {
if (keys.size() == 1) {
map.put(keys.get(0), value);
} else {
setValueForKeyPath((Map) map.get(keys.get(0)), keys.subList(1, keys.size()), value);
}
}
che può quindi essere utilizzato come
getValueForKeyPath(m, asList("a","aa","aab")
o
setValueForKeyPath(m, asList("a","aa", "aab"), "univers")