Gibt es eine Möglichkeit, eine Java HashMap wie diese zu initialisieren?
Map<String,String> test =
new HashMap<String, String>{"test":"test","test":"test"};
Was wäre die richtige Syntax? Ich habe diesbezüglich nichts gefunden. Ist dies möglich? Ich suche nach dem kürzesten/schnellsten Weg, um einige "endgültige/statische" Werte in eine Karte zu setzen, die sich nie ändern und bei der Erstellung der Karte im Voraus bekannt sind.
Ja, dies ist jetzt möglich. In Java 9 wurden einige Factory-Methoden hinzugefügt, die die Erstellung von Maps vereinfachen:
// 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")
);
Im obigen Beispiel sind test
und test2
die gleichen, nur mit unterschiedlichen Ausdrücken für die Map. Die Methode Map.of
ist für bis zu zehn Elemente in der Map definiert, während die Methode Map.ofEntries
keine solche Begrenzung hat.
Beachten Sie, dass in diesem Fall die resultierende Map eine unveränderliche Map sein wird. Wenn Sie wollen, dass die Map veränderbar ist, können Sie sie erneut kopieren, z.B. mit mutableMap = new HashMap<>(Map.of("a", "b"));
(Siehe auch JEP 269 und die Javadoc)
Nein, Sie müssen alle Elemente manuell hinzufügen. Sie können einen Initialisierer in einer anonymen Unterklasse verwenden, um die Syntax ein wenig zu verkürzen:
Map<String, String> myMap = new HashMap<>() {{
put("a", "b");
put("c", "d");
}};
Allerdings kann die anonyme Unterklasse in einigen Fällen zu unerwünschtem Verhalten führen. Dazu gehört zum Beispiel:
Die Verwendung einer Funktion für die Initialisierung ermöglicht es Ihnen auch, eine Map in einem Initialisierer zu erzeugen, vermeidet aber unangenehme Nebeneffekte:
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;
}
Dies ist eine Möglichkeit.
HashMap<String, String> h = new HashMap<String, String>() {{
put("a","b");
}};
Sie sollten jedoch vorsichtig sein und sicherstellen, dass Sie den obigen Code verstehen (er erstellt eine neue Klasse, die von HashMap erbt). Daher sollten Sie hier mehr lesen: http://www.c2.com/cgi/wiki?DoubleBraceInitialization oder verwenden Sie einfach Guava:
Map<String, Integer> left = ImmutableMap.of("a", 1, "b", 2, "c", 3);
Map<String,String> test = new HashMap<String, String>()
{
{
put(key1, value1);
put(key2, value2);
}
};