我尝试过以下一行:
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',还有什么我需要做的吗?
答案 0 :(得分:48)
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的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>() {{