23

我试过以下行:

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”,还有什么需要做的吗?

4

3 回答 3

52

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

如果您只需要不可变集合,则可以使用 Google 的Guava库。ImmutableList,ImmutableSet并且ImmutableMap有几个重载的工厂方法甚至是使创建集合变得容易的构建器:

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 的集合工厂方法:

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)
);
于 2012-05-22T16:02:54.527 回答
11

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

Map<Character, Color> map = new HashMap<Character, Color>() {{ 
  put(new Character('r'), Color.red);
  put(new Character('b'), Color.black );
}};
于 2012-05-22T16:03:56.970 回答
0

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

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

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

Map<Character, Color> map = new HashMap<Character, Color>() {{ 
于 2012-05-22T16:29:57.627 回答