Finnes det noen måte å initialisere et Java HashMap som dette på?:
Map<String,String> test =
new HashMap<String, String>{"test":"test","test":"test"};
Hva ville være riktig syntaks? Jeg har ikke funnet noe om dette. Er dette mulig? Jeg leter etter den korteste/raskeste måten å legge inn noen "endelige/statiske" verdier i et kart som aldri endres og som er kjent på forhånd når kartet opprettes.
Ja, dette er mulig nå. I Java 9 er det lagt til et par fabrikkmetoder som forenkler opprettelsen av kart:
// 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")
);
I eksemplet ovenfor vil både test
og test2
være det samme, bare med forskjellige måter å uttrykke kartet på. Metoden Map.of
er definert for opptil ti elementer i kartet, mens metoden Map.ofEntries
ikke har noen slik begrensning.
Merk at i dette tilfellet vil det resulterende kartet være et uforanderlig kart. Hvis du vil at kartet skal være foranderlig, kan du kopiere det igjen, f.eks. ved å bruke mutableMap = new HashMap<>(Map.of("a", "b"));
.
Nei, du må legge til alle elementene manuelt. Du kan bruke en initialisator i en anonym underklasse for å gjøre syntaksen litt kortere:
Map<String, String> myMap = new HashMap<>() {{
put("a", "b");
put("c", "d");
}};
Den anonyme underklassen kan imidlertid føre til uønsket oppførsel i noen tilfeller. Dette inkluderer for eksempel:
Ved å bruke en funksjon for initialisering kan du også generere et kart i en initialisator, men unngår stygge bivirkninger:
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;
}
Dette er én måte.
HashMap<String, String> h = new HashMap<String, String>() {{
put("a","b");
}};
Du bør imidlertid være forsiktig og sørge for at du forstår koden ovenfor (den oppretter en ny klasse som arver fra HashMap). Derfor bør du lese mer her: http://www.c2.com/cgi/wiki?DoubleBraceInitialization , eller rett og slett bruke Guava:
Map<String, Integer> left = ImmutableMap.of("a", 1, "b", 2, "c", 3);