Map
в том, что в отличие от других коллекций инициализация должна принять параметрами набор пар неопределенного размера. Поэтому varargs здесь не подходит.Самый примитивный, многословный, но простой способ – добавить элементы сразу после создания. Для мапы-поля класса это можно сделать в конструкторе или блоке инициализации.
Map<String, String> map = new HashMap<>();
{
map.put("one", "first");
map.put("two", "second");
}
Идиома double brace initialization. Компактная запись, которая расшифровывается компилятором как создание анонимного класса-наследника от
HashMap
, с добавлением элементов в блоке статической инициализации. Создание нового класса приводит к дополнительным накладным расходам, так делать не рекомендуется.
new HashMap<String, String>() {{
put("one", "first");
put("two", "second");
}};
Для специальных случаев, пустой и одноэлементной неизменяемых мап, в классе
Collections
есть соответствующие фабричные методы emptyMap()
и singletonMap(key, value)
.Удобно создавать
HashMap
из стрима. Коллектор Collectors.toMap(keyMapper, valueMapper)
с помощью мапперов превратит объекты потока в ключи и значения.В Java 9 наконец появились фабричные метод
Map.of()
, перегруженный для разного количества пар параметров, и Map.ofEntries()
с varargs-аргументом.До Java 9 подобное было реализовано во многих популярных библиотеках, например
ImmutableMap.of
в Guava и MapUtils.putAll()
в Apache Commons.