Иногда при работе с Java возникает потребность инициализировать HashMap непосредственно при его объявлении. Хотелось бы сделать это примерно так:
Map<String,String> test = new HashMap<String, String>{"key1":"value1","key2":"value2"};
К сожалению, в Java такой синтаксис не поддерживается. Однако есть несколько альтернативных способов инициализировать HashMap непосредственно при объявлении.
Один из них — использование анонимного внутреннего класса:
Map<String, String> test = new HashMap<String, String>(){ { put("key1", "value1"); put("key2", "value2"); } };
Здесь создается анонимный внутренний класс, унаследованный от HashMap, и в нем сразу же инициализируются значения.
Такой способ имеет свои недостатки. Во-первых, он создает дополнительный класс для каждого экземпляра map, что может повлиять на производительность. Во-вторых, полученный таким образом map не может быть final.
Если важно, чтобы map был final, можно использовать статический блок инициализации:
public class Test { private static final Map<String, String> test; static { test = new HashMap<String, String>(); test.put("key1", "value1"); test.put("key2", "value2"); } }
Начиная с Java 8, можно также использовать методы Stream API для инициализации map:
Map<String, String> test = Stream.of(new String[][] { { "key1", "value1" }, { "key2", "value2" }, }).collect(Collectors.toMap(data -> data[0], data -> data[1]));
Наконец, с появлением Java 9, появился еще один удобный способ инициализации map — это метод Map.of():
Map<String, String> test = Map.of("key1", "value1", "key2", "value2");
Однако стоит помнить, что такой map неизменяемый, и попытка добавить в него новые элементы приведет к исключению UnsupportedOperationException.
Добавить комментарий