Мне просто было интересно, можно ли определить содержимое объекта карты при инициализации.
Например, можно создать массив как:
new String[] {“apples”, “bananas”, “pears”}
Итак, мне было интересно, можем ли мы сделать что-то подобное для карт.
Мне просто было интересно, можно ли определить содержимое объекта карты при инициализации.
Например, можно создать массив как:
new String[] {“apples”, “bananas”, “pears”}
Итак, мне было интересно, можем ли мы сделать что-то подобное для карт.
Вы можете как бы использовать этот синтаксический трюк:
Map<String,String> map = new HashMap<String,String>() {{
put("x", "y");
put("a", "b");
}};
Хотя не очень приятно. Это создает анонимный подкласс HashMap
и заполняет его в инициализаторе экземпляра.
map
содержит неявный объект this
, ссылающийся на родительский объект. Подробнее здесь: blog.jooq.org/2014/12/08/
- person Dan Alvizu; 09.05.2017
new HashMap<String,String>(new HashMap<String,String>() {{put("x", "y"); put("a", "b");}});
- person Ryan; 04.10.2017
Если ваш Map
будет неизменным после создания, и вы не против добавления зависимости, Guava предлагает неплохой беглый синтаксис:
Map<K,V> aMap = ImmutableMap.<K,V>builder().put(key0, val0).put(key1,val1).build();
Если вы чувствуете себя действительно экзотично, Scala имеет синтаксис, точно такой же, как вы хотите, и совместим с другими Java. код:
val aMap = Map("a"->0, "b"->1)
Обратите внимание, что компилятор Scala определит общий тип Map
от String
до Int
в зависимости от того, что вы в него вставили, хотя вы также можете указать его явно.
Однако, если это всего лишь разовое задание, я бы выбрал синтаксис на основе инициализатора. И у библиотеки Guava, и у языка Scala есть еще много чего порекомендовать, но изучение совершенно новой библиотеки / языка может оказаться за бортом.
Вы можете использовать блоки инициализатора:
class Foo {
//using static initializer block
static Map<String,String> m1 = new HashMap<String,String>();
static {
m1.put("x","y");
m1.put("a","b");
}
//using initializer block
Map<String,String> m2 = new HashMap<String,String>();
{
m2.put("x","y");
m2.put("a","b");
}
}
Что-то очень хитрое ... можно улучшить, но это всего лишь направление: Определите статический помощник для преобразования массива объектов в карту этого типа:
public static<K,V> Map<K, V> fromArray(Object[] anObjArray){
int size = anObjArray.length;
Map<K, V> aMap = new HashMap<K, V>();
for (int i=0;i<=size/2;i=i+2){
K key = (K)anObjArray[i];
V value = (V)anObjArray[i+1];
aMap.put(key, value);
}
return aMap;
}
то вы можете создать карту, используя это:
Map<Integer, String> aMap = MapUtils.<Integer, String>fromArray(new Object[]{1, "one", 2,"two"});
Я бы лично поддержал предложение строителя Gauva от @Carl :-)