Лучший конструктор карт - PullRequest
7 голосов
/ 26 июля 2011

Есть ли более упрощенный способ сделать следующее?

Map<String, String> map = new HashMap<String, String>();
map.put("a", "apple");
map.put("b", "bear");
map.put("c", "cat");

Я ищу что-то более близкое к этому.

 Map<String, String> map = MapBuilder.build("a", "apple", "b", "bear", "c", "cat");

Ответы [ 4 ]

15 голосов
/ 26 июля 2011

Всегда есть двойная инициализация :

Map<String, String> map = new HashMap<String, String>(){{
    put("a", "apple"); put("b", "bear"); put("c", "cat");}};

Есть проблемы с этим подходом. Он возвращает анонимный внутренний класс, расширяющий HashMap, а не HashMap. Если вам нужно сериализовать карту, то знайте, что сериализация внутренних классов не рекомендуется .

13 голосов
/ 26 июля 2011

Нет, нет, но я написал метод, чтобы сделать именно это, вдохновленный классом Objective-C NSDictionary:

public static Map<String, Object> mapWithKeysAndObjects(Object... objects) {

    if (objects.length % 2 != 0) {
        throw new IllegalArgumentException(
                "The array has to be of an even size - size is "
                        + objects.length);
    }

    Map<String, Object> values = new HashMap<String, Object>();

    for (int x = 0; x < objects.length; x+=2) {
      values.put((String) objects[x], objects[x + 1]);
    }

    return values;

}
8 голосов
/ 26 июля 2011

Вы можете использовать ImmutableMap.Builder из библиотеки коллекций Google.

3 голосов
/ 26 июля 2011

Вы всегда можете использовать инициализация двойной скобкой :

Map<String, String> map = new HashMap<String, String>() {{
    put("foo", "bar");
    put("baz", "qux");
}}

Но имейте в виду, что это может быть неэффективным согласно этим ответам .

...