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

24

我已经尝试了下面这行代码:

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

但是Netbeans 7拒绝了此操作,并显示错误信息'{' expected, ';' expected

我已将源/二进制格式设置为“JDK 7”,平台设置为“JDK 1.7”,是否还需要做其他事情?


1
在Java 8中,您可以使用这个技巧从lambda表达式中获得合理的映射字面量:https://gist.github.com/galdosd/10823529 - Domingo Ignacio
2
那个技巧取决于所使用的编译器。我认为它适用于Eclipse,但不适用于javac。 - Stuart Marks
3个回答

52

正如在这个问题中所讨论的那样:《项目硬币》中的集合增强功能是否会出现在JDK8中?,Java 7和Java 8都不支持集合字面值。

如果您只需要不可变集合,可以使用谷歌的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相似的集合工厂方法

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
哦,我本应该查一下的。真是遗憾;我很期待使用集合字面量呢。谢谢! - DaedalusUsedPerl

11

你需要定义一个具体的映射实现,可以选择与双括号初始化结合使用:

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

2
嗯,如果有人对帖子进行了负面评价,能够得到一些反馈就好了。我们都在这里学习,不是吗? - Thomas
8
我个人并没有给你投反对票,但我看到你的代码有两个问题。首先,仅用于初始化的匿名子类不是一个很好的实践方式。请参考https://dev59.com/pnNA5IYBdhLWcg3wh-YC#924536。其次,你不必手动创建一个新的字符实例,自动装箱会为你完成:`put('r', Color.red);`。 - Natix
8
@Natix 是的,双大括号初始化并不是真正推荐的方法,我只是将其作为回答OP问题的一种方式提到了它。事实上,有更好的替代方法来实现这个目标。此外,手动创建Character(手动装箱)或使用自动装箱并不是降低评分的原因。这只是一种风格问题,我尽可能使用OP的代码,以避免混淆。 - Thomas
2
应该在所有本地类上使用valueOf。 - stolsvik
我喜欢这个。我最近在其他地方看到了类似的结构,但有人建议永远不要使用匿名子类编写文本。我不同意。 - GhostCat

0
稍微解释一下Thomas的回答... Map是一个接口,必须通过其中一个相关的具体实现(HashMap、TreeMap或LinkedHashMap)来实例化。然而,将引用变量声明为接口实现而不是特定的具体实现仍然是一个好习惯,因为它提供了未来的灵活性。
关于代码片段,我认为你仍然需要在声明的赋值方面定义键值对。所以,我会改变:
Map<Character, Color> map = new HashMap<>() {{ 

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

4
不,Java 1.7版本中添加了<>运算符作为语法糖,这样你就不需要那么冗长的表达。 - lmsurprenant
3
@lmsurprenant,您无法在匿名内部类中使用<>。 - Jonas Alves

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接