ТЛ; др
Используйте Map.of…
методы в Java 9 и позже.
Map< String , String > animalSounds =
Map.of(
"dog" , "bark" , // key , value
"cat" , "meow" , // key , value
"bird" , "chirp" // key , value
)
;
Map.of
Java 9 добавила серию Map.of
статических методов, чтобы сделать то, что вы хотите: создать неизменяемое Map
с использованием буквального синтаксиса .
Карта (коллекция записей) является неизменной, поэтому вы не можете добавлять или удалять записи после создания экземпляра. Кроме того, ключ и значение каждой записи являются неизменяемыми, не могут быть изменены. См. Javadoc для других правил, таких как недопустимые значения NULL, дубликаты ключей не допускаются, и порядок итераций сопоставлений является произвольным.
Давайте посмотрим на эти методы, используя некоторые примерные данные для карты дня недели для человека, который, как мы ожидаем, будет работать в этот день.
Person alice = new Person( "Alice" );
Person bob = new Person( "Bob" );
Person carol = new Person( "Carol" );
Map.of()
Map.of
создает пустой Map
. Не изменяется, поэтому вы не можете добавлять записи. Вот пример такой карты, пустой, без записей.
Map < DayOfWeek, Person > dailyWorkerEmpty = Map.of();
dailyWorkerEmpty.toString (): {}
Map.of( … )
Map.of( k , v , k , v , …)
Есть несколько методов, которые принимают от 1 до 10 пар ключ-значение. Вот пример двух записей.
Map < DayOfWeek, Person > weekendWorker =
Map.of(
DayOfWeek.SATURDAY , alice , // key , value
DayOfWeek.SUNDAY , bob // key , value
)
;
выходныеWorker.toString (): {SUNDAY = Person {name = 'Bob'}, SATURDAY = Person {name = 'Alice'}}
Map.ofEntries( … )
Map.ofEntries( Map.Entry , … )
принимает любое количество объектов, реализующих Map.Entry
интерфейс. Java объединяет два класса, реализующих этот интерфейс, один изменяемый, другой неизменный: AbstractMap.SimpleEntry
, AbstractMap.SimpleImmutableEntry
. Но нам не нужно указывать конкретный класс. Нам просто нужно вызвать Map.entry( k , v )
метод, передать наш ключ и наше значение, и мы вернем объект некоторого Map.Entry
интерфейса, реализующего класс .
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 (): {WEDNESDAY = Person {name = 'Bob'}, TUESDAY = Person {name = 'Bob'}, THURSDAY = Person {name = 'Carol'}, FRIDAY = Person {name = 'Carol'} , ПОНЕДЕЛЬНИК = Персона {имя = 'Алиса'}}
Map.copyOf
Java 10 добавил метод Map.copyOf
. Передайте существующую карту, верните неизменную копию этой карты.
Ноты
Обратите внимание, что порядок итераторов карт, создаваемых с помощью Map.of
, не гарантируется. Записи имеют произвольный порядок. Не пишите код в зависимости от увиденного порядка, так как документация предупреждает, что порядок может быть изменен.
Обратите внимание , что все эти Map.of…
методы возвращают Map
из неопределенного класса . Базовый конкретный класс может даже варьироваться от одной версии Java к другой. Эта анонимность позволяет Java выбирать из различных реализаций, что бы ни подходило для ваших конкретных данных. Например, если ваши ключи взяты из перечисления , Java может использовать EnumMap
под крышками.