Ali obstaja kakšen način za takšno inicializacijo zemljevida Java HashMap?:
Map<String,String> test =
new HashMap<String, String>{"test":"test","test":"test"};
Kakšna bi bila pravilna sintaksa? V zvezi s tem nisem našel ničesar. Ali je to mogoče? Iščem najkrajši/najhitrejši način, da v zemljevid vstavim nekaj "končnih/statičnih" vrednosti, ki se nikoli ne spremenijo in so vnaprej znane ob ustvarjanju zemljevida.
Da, to je zdaj mogoče. V Javi 9 je bilo dodanih nekaj tovarniških metod, ki poenostavljajo ustvarjanje zemljevidov :
// this works for up to 10 elements:
Map<String, String> test1 = Map.of(
"a", "b",
"c", "d"
);
// this works for any number of elements:
Map<String, String> test2 = Map.ofEntries(
entry("a", "b"),
entry("c", "d")
);
V zgornjem primeru bosta tako test
kot test2
enaka, le z različnimi načini izražanja zemljevida. Metoda Map.of
je opredeljena za največ deset elementov v zemljevidu, medtem ko metoda Map.ofEntries
ne bo imela takšne omejitve.
Upoštevajte, da bo v tem primeru dobljeni zemljevid nespremenljiv zemljevid. Če želite, da je zemljevid spremenljiv, ga lahko ponovno kopirate, npr. z uporabo mutableMap = new HashMap<>(Map.of("a", "b"));
(Glej tudi JEP 269 in Javadoc)
Ne, vse elemente boste morali dodati ročno. Za nekoliko krajšo sintakso lahko uporabite inicializator v anonimnem podrazredu:
Map<String, String> myMap = new HashMap<>() {{
put("a", "b");
put("c", "d");
}};
Vendar lahko anonimni podrazred v nekaterih primerih uvede neželeno obnašanje. To vključuje na primer:
Uporaba funkcije za inicializacijo vam bo omogočila tudi ustvarjanje zemljevida v inicializatorju, vendar se izogne neprijetnim stranskim učinkom:
Map<String, String> myMap = createMap();
private static Map<String, String> createMap() {
Map<String,String> myMap = new HashMap<String,String>();
myMap.put("a", "b");
myMap.put("c", "d");
return myMap;
}
To je eden od načinov.
HashMap<String, String> h = new HashMap<String, String>() {{
put("a","b");
}};
Vendar morate biti previdni in se prepričati, da razumete zgornjo kodo (ustvarja nov razred, ki deduje od HashMap). Zato si preberite več tukaj: http://www.c2.com/cgi/wiki?DoubleBraceInitialization. ali pa preprosto uporabite program Guava:
Map<String, Integer> left = ImmutableMap.of("a", 1, "b", 2, "c", 3);