Проблема с созданием
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.