Navigazione attraverso le mappe nidificate in Java

1

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")
    
posta Ueli Hofstetter 06.07.2018 - 16:37
fonte

0 risposte

Leggi altre domande sui tag