tl; dr
Użyj Map.of…metod w Javie 9 i nowszych.
Map< String , String > animalSounds =
Map.of(
"dog" , "bark" , // key , value
"cat" , "meow" , // key , value
"bird" , "chirp" // key , value
)
;
Map.of
Java 9 dodała szereg Map.ofstatycznych metod, aby zrobić dokładnie to, co chcesz: utworzyć instancję niezmiennego Mapza pomocą składni literalnej .
Mapa (zbiór wpisów) jest niezmienna, więc nie można dodawać ani usuwać wpisów po utworzeniu wystąpienia. Ponadto klucz i wartość każdego wpisu są niezmienne, nie można ich zmienić. Zobacz Javadoc, aby poznać inne reguły, takie jak niedozwolone wartości NULL, niedozwolone duplikaty kluczy, a kolejność odwzorowań jest dowolna.
Spójrzmy na te metody, wykorzystując przykładowe dane do mapy dnia tygodnia dla osoby, która, jak się spodziewamy, będzie pracować tego dnia.
Person alice = new Person( "Alice" );
Person bob = new Person( "Bob" );
Person carol = new Person( "Carol" );
Map.of()
Map.oftworzy puste Map. Niemodyfikowalna, więc nie można dodawać wpisów. Oto przykład takiej mapy, pustej bez wpisów.
Map < DayOfWeek, Person > dailyWorkerEmpty = Map.of();
dailyWorkerEmpty.toString (): {}
Map.of( … )
Map.of( k , v , k , v , …)jest kilka metod, które przyjmują od 1 do 10 par klucz-wartość. Oto przykład dwóch wpisów.
Map < DayOfWeek, Person > weekendWorker =
Map.of(
DayOfWeek.SATURDAY , alice , // key , value
DayOfWeek.SUNDAY , bob // key , value
)
;
weekendWorker.toString (): {NIEDZIELA = Osoba {imię = „Bob”}, SOBOTA = Osoba {imię = „Alice”}}
Map.ofEntries( … )
Map.ofEntries( Map.Entry , … )pobiera dowolną liczbę obiektów implementujących Map.Entryinterfejs. Java łączy dwie klasy implementujące ten interfejs, jedną zmienną, drugą niezmienną: AbstractMap.SimpleEntry, AbstractMap.SimpleImmutableEntry. Ale nie musimy określać konkretnej klasy. Musimy tylko wywołać Map.entry( k , v )metodę, przekazać nasz klucz i naszą wartość, i otrzymamy obiekt Map.Entryinterfejsu implementacyjnego klasy .
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 (): {ŚRODA = Osoba {imię = 'Bob'}, WTOREK = Osoba {imię = 'Bob'}, CZWARTEK = Osoba {imię = 'Carol'}, PIĄTEK = Osoba {name = 'Carol'} , PONIEDZIAŁEK = Osoba {name = 'Alice'}}
Map.copyOf
Java 10 dodała tę metodę Map.copyOf. Minąć istniejącą mapę, odzyskać niezmienną kopię tej mapy.
Notatki
Zauważ, że kolejność iterator map produkowane przez Map.ofsię nie jest gwarantowana. Wpisy mają dowolny porządek. Nie pisz kodu w oparciu o widziane zamówienie, ponieważ dokumentacja ostrzega, że zamówienie może ulec zmianie.
Należy pamiętać, że wszystkie te Map.of…metody zwracają Mapz nieokreślonej klasy . Podstawowa konkretna klasa może nawet różnić się w zależności od wersji Java. Ta anonimowość pozwala Java wybierać spośród różnych implementacji, niezależnie od tego, które optymalnie pasują do konkretnych danych. Na przykład, jeśli klucze pochodzą z wyliczenia , Java może użyć EnumMappod okładkami.