如何在初始化时定义Map内容?

时间:2011-01-30 13:14:00

标签: java collections map initialization

我只是想知道是否可以在初始化时定义Map对象的内容。

例如,可以创建一个数组,如:

new String[] {“apples”, “bananas”, “pears”}

所以,我想知道我们能为地图做些什么。

4 个答案:

答案 0 :(得分:32)

你可以使用这种语法技巧:

Map<String,String> map = new HashMap<String,String>() {{
    put("x", "y");
    put("a", "b");
}};
但是,不是很愉快。这将创建一个HashMap的匿名子类,并在实例初始化程序中填充它。

答案 1 :(得分:15)

如果您的Map在创建后将不可变,并且您不介意添加依赖项,Guava会提供一些不错的流畅syntax

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泛型类型是从StringInt,尽管您也可以明确指定它。 / p>

然而,如果这只是一次性的话,我会选择基于初始化器的语法。 Guava库和Scala语言都有很多推荐它们,但是学习一个全新的库/语言可能会太过分了。

答案 2 :(得分:2)

您可以使用初始化程序块:

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

} 

答案 3 :(得分:1)

非常hacky ..可以改进,但这只是一个方向: 定义一个静态助手,将对象数组转换为此类型的映射:

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

我个人第二次来自@Carl的Gauva建造者建议: - )