tl; dr
Utilisez des Map.of…
méthodes dans Java 9 et versions ultérieures.
Map< String , String > animalSounds =
Map.of(
"dog" , "bark" , // key , value
"cat" , "meow" , // key , value
"bird" , "chirp" // key , value
)
;
Map.of
Java 9 a ajouté une série de Map.of
méthodes statiques pour faire exactement ce que vous voulez: Instancier une immuable en Map
utilisant une syntaxe littérale .
La carte (une collection d'entrées) est immuable, vous ne pouvez donc pas ajouter ou supprimer d'entrées après l'instanciation. De plus, la clé et la valeur de chaque entrée sont immuables et ne peuvent pas être modifiées. Voir le Javadoc pour d'autres règles, telles qu'aucune valeur NULL autorisée, aucune clé en double autorisée et l'ordre d'itération des mappages est arbitraire.
Examinons ces méthodes, en utilisant des exemples de données pour une carte du jour de la semaine pour une personne qui, selon nous, travaillera ce jour-là.
Person alice = new Person( "Alice" );
Person bob = new Person( "Bob" );
Person carol = new Person( "Carol" );
Map.of()
Map.of
crée un vide Map
. Non modifiable, vous ne pouvez donc pas ajouter d'entrées. Voici un exemple d'une telle carte, vide sans entrées.
Map < DayOfWeek, Person > dailyWorkerEmpty = Map.of();
dailyWorkerEmpty.toString (): {}
Map.of( … )
Map.of( k , v , k , v , …)
sont plusieurs méthodes qui prennent 1 à 10 paires clé-valeur. Voici un exemple de deux entrées.
Map < DayOfWeek, Person > weekendWorker =
Map.of(
DayOfWeek.SATURDAY , alice , // key , value
DayOfWeek.SUNDAY , bob // key , value
)
;
weekendWorker.toString (): {DIMANCHE = Personne {nom = 'Bob'}, SAMEDI = Personne {nom = 'Alice'}}
Map.ofEntries( … )
Map.ofEntries( Map.Entry , … )
prend n'importe quel nombre d'objets implémentant l' Map.Entry
interface. Java regroupe deux classes implémentant cette interface, l'une mutable, l'autre immuable: AbstractMap.SimpleEntry
, AbstractMap.SimpleImmutableEntry
. Mais nous n'avons pas besoin de spécifier une classe concrète. Nous avons simplement besoin d'appeler la Map.entry( k , v )
méthode, de passer notre clé et notre valeur, et nous récupérons un objet d'une certaine Map.Entry
interface d' implémentation de classe .
Map < DayOfWeek, Person > weekdayWorker = Map.ofEntries(
Map.entry( DayOfWeek.MONDAY , alice ) , // Call to `Map.entry` method returns an object implementing `Map.Entry`.
Map.entry( DayOfWeek.TUESDAY , bob ) ,
Map.entry( DayOfWeek.WEDNESDAY , bob ) ,
Map.entry( DayOfWeek.THURSDAY , carol ) ,
Map.entry( DayOfWeek.FRIDAY , carol )
);
weekendWorker.toString (): {WEDNESDAY = Person {name = 'Bob'}, TUESDAY = Person {name = 'Bob'}, THURSDAY = Person {name = 'Carol'}, FRIDAY = Person {name = 'Carol'} , LUNDI = Personne {name = 'Alice'}}
Map.copyOf
Java 10 a ajouté la méthode Map.copyOf
. Passez une carte existante, récupérez une copie immuable de cette carte.
Remarques
Notez que l'ordre des itérateurs des cartes produites via neMap.of
sont pas garanti. Les entrées ont un ordre arbitraire. N'écrivez pas de code basé sur la commande vue, car la documentation prévient que la commande est susceptible de changer.
Notez que toutes ces Map.of…
méthodes renvoient un Map
d' une classe non spécifiée . La classe concrète sous-jacente peut même varier d'une version de Java à une autre. Cet anonymat permet à Java de choisir parmi diverses implémentations, quelle que soit celle qui correspond de manière optimale à vos données particulières. Par exemple, si vos clés proviennent d'une énumération , Java peut utiliser un EnumMap
sous les couvertures.