Existe-t-il un moyen d'initialiser un HashMap Java comme ceci ?
Map<String,String> test =
new HashMap<String, String>{"test":"test","test":"test"};
Quelle serait la syntaxe correcte ? Je n'ai rien trouvé à ce sujet. Est-ce possible ? Je cherche le moyen le plus court/rapide de mettre dans une carte des valeurs "définitives/statiques" qui ne changent jamais et qui sont connues à l'avance lors de la création de la carte.
Oui, c'est possible maintenant. Dans Java 9, quelques méthodes d'usine ont été ajoutées pour simplifier la création de cartes :
// 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")
);
Dans l'exemple ci-dessus, test
et test2
seront les mêmes, mais avec des façons différentes d'exprimer la carte. La méthode Map.of
est définie pour un maximum de dix éléments dans la carte, alors que la méthode Map.ofEntries
n'aura pas cette limite.
Notez que dans ce cas, la carte résultante sera une carte immuable. Si vous voulez que la carte soit mutable, vous pouvez la recopier, par exemple en utilisant mutableMap = new HashMap<>(Map.of("a", "b"));
(Voir aussi JEP 269 et la Javadoc)
Non, vous devrez ajouter tous les éléments manuellement. Vous pouvez utiliser un initialisateur dans une sous-classe anonyme pour rendre la syntaxe un peu plus courte :
Map<String, String> myMap = new HashMap<>() {{
put("a", "b");
put("c", "d");
}};
Cependant, la sous-classe anonyme peut introduire un comportement indésirable dans certains cas. Il s'agit par exemple de :
L'utilisation d'une fonction pour l'initialisation vous permettra également de générer une carte dans un initialisateur, mais évite les effets secondaires désagréables :
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;
}
C'est une façon de faire.
HashMap<String, String> h = new HashMap<String, String>() {{
put("a","b");
}};
Cependant, vous devez faire attention et vous assurer que vous comprenez le code ci-dessus (il crée une nouvelle classe qui hérite de HashMap). Par conséquent, vous devriez en lire plus ici : http://www.c2.com/cgi/wiki?DoubleBraceInitialization ou simplement utiliser Guava :
Map<String, Integer> left = ImmutableMap.of("a", 1, "b", 2, "c", 3);