如何在Java 7中使用集合文字?

时间:2012-05-22 16:00:05

标签: java collections

我尝试过以下一行:

Map<Character, Color> map={new Character('r'):Color.red,new Character('b'):Color.black};

但Netbeans 7拒绝了这一点,并显示错误消息'{' expected, ';' expected

我将Source / Binary格式设置为'JDK 7',将平台设置为'JDK 1.7',还有什么我需要做的吗?

3 个答案:

答案 0 :(得分:48)

Java 7和Java 8都不支持集合文字,如本问题所述:Are Project Coin's collection enhancements going to be in JDK8?

如果您只需要不可变的集合,则可以使用Google的Guava库。 ImmutableListImmutableSetImmutableMap有几个重载的工厂方法甚至构建器,可以轻松创建集合:

List<Integer> list = ImmutableList.of(1, 1, 2, 3, 5, 8, 13, 21);
Set<String> set = ImmutableSet.of("foo", "bar", "baz", "batman");
Map<Integer, String> map = ImmutableMap.of(1, "one", 2, "two", 3, "three");

修改

Java 9添加了类似于Guava的collection factory methods

List.of(a, b, c);
Set.of(d, e, f, g);
Map.of(k1, v1, k2, v2)

Map.ofEntries(
    entry(k1, v1),
    entry(k2, v2),
    entry(k3, v3),
    // ...
    entry(kn, vn)
);

答案 1 :(得分:11)

您需要定义具体的地图实现,可选择与双括号初始化结合使用:

Map<Character, Color> map = new HashMap<Character, Color>() {{ 
  put(new Character('r'), Color.red);
  put(new Character('b'), Color.black );
}};

答案 2 :(得分:0)

在Thomas的答案上稍微扩展一下...... Map是一个接口,必须通过一个相关的具体实现(HashMap,TreeMap或LinkedHashMap)进行实例化。这仍然是一种很好的做法;但是,要将您的引用变量声明为接口实现而不是具体的具体内容,因为它提供了未来的灵活性。

关于代码片段,我认为你仍然需要在声明的赋值方面定义的键值对。所以,我会改变:

Map<Character, Color> map = new HashMap<>() {{ 

Map<Character, Color> map = new HashMap<Character, Color>() {{