tl; dr
Verwenden Sie Map.of…
Methoden in Java 9 und höher.
Map< String , String > animalSounds =
Map.of(
"dog" , "bark" , // key , value
"cat" , "meow" , // key , value
"bird" , "chirp" // key , value
)
;
Map.of
Java 9 hat eine Reihe Map.of
statischer Methoden hinzugefügt , um genau das zu tun, was Sie wollen: Instanziieren Sie eine unveränderlicheMap
Methode mithilfe der Literal-Syntax .
Die Karte (eine Sammlung von Einträgen) ist unveränderlich, sodass Sie nach dem Instanziieren keine Einträge hinzufügen oder entfernen können. Auch der Schlüssel und der Wert jedes Eintrags sind unveränderlich, können nicht geändert werden. Weitere Regeln finden Sie im Javadoc , z. B. keine zulässigen NULL-Werte, keine zulässigen doppelten Schlüssel und die willkürliche Reihenfolge der Zuordnungen.
Schauen wir uns diese Methoden an und verwenden einige Beispieldaten für eine Karte des Wochentags für eine Person, von der wir erwarten, dass sie an diesem Tag arbeitet.
Person alice = new Person( "Alice" );
Person bob = new Person( "Bob" );
Person carol = new Person( "Carol" );
Map.of()
Map.of
erstellt eine leere Map
. Nicht änderbar, daher können Sie keine Einträge hinzufügen. Hier ist ein Beispiel für eine solche Karte, leer ohne Einträge.
Map < DayOfWeek, Person > dailyWorkerEmpty = Map.of();
dailyWorkerEmpty.toString (): {}
Map.of( … )
Map.of( k , v , k , v , …)
Es gibt verschiedene Methoden, die 1 bis 10 Schlüssel-Wert-Paare annehmen. Hier ist ein Beispiel für zwei Einträge.
Map < DayOfWeek, Person > weekendWorker =
Map.of(
DayOfWeek.SATURDAY , alice , // key , value
DayOfWeek.SUNDAY , bob // key , value
)
;
WeekendWorker.toString (): {SUNDAY = Person {Name = 'Bob'}, SAMSTAG = Person {Name = 'Alice'}}
Map.ofEntries( … )
Map.ofEntries( Map.Entry , … )
Nimmt eine beliebige Anzahl von Objekten, die die Map.Entry
Schnittstelle implementieren . Java bündelt zwei Klassen, die diese Schnittstelle implementieren, eine veränderlich, die andere unveränderlich: AbstractMap.SimpleEntry
, AbstractMap.SimpleImmutableEntry
. Wir müssen jedoch keine konkrete Klasse angeben. Wir müssen lediglich die Map.entry( k , v )
Methode aufrufen , unseren Schlüssel und unseren Wert übergeben und erhalten ein Objekt einer Klasse zurück, die eine Map.Entry
Schnittstelle implementiert .
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 )
);
weekdayWorker.toString (): {MITTWOCH = Person {Name = 'Bob'}, DIENSTAG = Person {Name = 'Bob'}, DONNERSTAG = Person {Name = 'Carol'}, FREITAG = Person {Name = 'Carol'} , MONTAG = Person {name = 'Alice'}}
Map.copyOf
Java 10 hat die Methode hinzugefügt Map.copyOf
. Übergeben Sie eine vorhandene Karte und erhalten Sie eine unveränderliche Kopie dieser Karte zurück.
Anmerkungen
Beachten Sie, dass die Iterator Reihenfolge der Karten hergestellt via Map.of
ist nicht garantiert. Die Einträge haben eine beliebige Reihenfolge. Schreiben Sie keinen Code basierend auf der angezeigten Reihenfolge, da die Dokumentation warnt, dass sich die Bestellung ändern kann.
Beachten Sie, dass alle diese Map.of…
Methoden eine Rückkehr Map
von einer nicht spezifizierten Klasse . Die zugrunde liegende konkrete Klasse kann sogar von einer Java-Version zur anderen variieren. Diese Anonymität ermöglicht es Java, aus verschiedenen Implementierungen auszuwählen, je nachdem, was optimal zu Ihren Daten passt. Wenn Ihre Schlüssel beispielsweise aus einer Enumeration stammen , verwendet Java möglicherweise ein EnumMap
Under-the-Cover.