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.of
statycznych metod, aby zrobić dokładnie to, co chcesz: utworzyć instancję niezmiennego Map
za 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.of
tworzy 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.Entry
interfejs. 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.Entry
interfejsu 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.of
się 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ą Map
z 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ć EnumMap
pod okładkami.