更好的地图构造函数

时间:2011-07-26 17:15:59

标签: java collections map

是否有更简化的方法来执行以下操作?

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");

5 个答案:

答案 0 :(得分:15)

始终有double-brace initialization

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

这种方法存在问题。它返回一个扩展HashMap的匿名内部类,而不是HashMap。如果您需要序列化地图,请知道serialization of inner classes is discouraged

答案 1 :(得分:13)

不,没有,但我写了一个方法来完成这个,受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;

}

答案 2 :(得分:8)

您可以使用Google馆藏库中的ImmutableMap.Builder

答案 3 :(得分:3)

您始终可以使用双括号初始化

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

但请记住,根据these answers,这可能效率不高。

答案 4 :(得分:1)

Java 9 添加了Map.of,例如:

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

最多支持10个条目。对于更多条目,您可以使用重载条目:

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

请注意,这些方法不会返回HashMap。它会返回优化的不可变地图。