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

Dae*_*erl 20 java collections

我试过以下一行:

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

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

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

Nat*_*tix 50

Java 7和Java 8都不支持集合文字,正如这个问题所讨论的那样:Project Coin的集合增强功能是否会在JDK8中进行?

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

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");
Run Code Online (Sandbox Code Playgroud)

编辑

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)
);
Run Code Online (Sandbox Code Playgroud)


Tho*_*mas 11

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

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

  • 我个人没有投票给你,但我发现你的代码存在两个问题.首先,为初始化创建一个匿名子类并不是一个很好的做法.请参阅http://stackoverflow.com/a/924536/581205其次,您不必手动创建新的Character实例,自动装箱会为您执行此操作:`put('r',Color.red);` (8认同)
  • @Natix是的,双支撑初始化并不是真的推荐我刚刚提到它作为OP问题的答案.确实有更好的替代方案来实现这一目标.除此之外,手动创建"角色"(手动拳击)或使用自动装箱并不是导致失败的真正原因.这是一个风格问题,我试图尽可能多地使用OP的代码,以避免混淆. (8认同)
  • 嗯,如果有人评价帖子,那么获得一些反馈意见会很好.我们都在这里学习,不是吗? (2认同)
  • 但是,应该在所有本机类上使用valueOf. (2认同)