如何在初始化时定义Map内容?

Lar*_*rry 14 java collections initialization map

我只是想知道是否可以在初始化时定义Map对象的内容.

例如,可以创建一个数组,如下所示:

new String[] {“apples”, “bananas”, “pears”}
Run Code Online (Sandbox Code Playgroud)

所以,我想知道我们能为地图做些类似的事情.

ska*_*man 33

你可以使用这种语法技巧:

Map<String,String> map = new HashMap<String,String>() {{
    put("x", "y");
    put("a", "b");
}};
Run Code Online (Sandbox Code Playgroud)

但不是很愉快.这将创建一个匿名子类HashMap,并在实例初始化程序中填充它.

  • 这是一个非常糟糕的做法:它会导致对当前对象的引用泄露.我希望我能投票,但我还不能. (2认同)

Car*_*arl 16

如果你Map在创建之后将不可变并且你不介意添加依赖项,那么Guava提供了一些不错的流利语法:

Map<K,V> aMap = ImmutableMap.<K,V>builder().put(key0, val0).put(key1,val1).build();
Run Code Online (Sandbox Code Playgroud)

如果您感觉异国情调,Scala的语法与您想要的完全相同,并且可与其他Java代码互操作:

val aMap = Map("a"->0, "b"->1)
Run Code Online (Sandbox Code Playgroud)

需要注意的是Scala编译器会推断出Map泛型类型是StringInt的基础上,你把它是什么,但可以明确指定它.

但是,如果这只是一次性的话,我会选择基于初始化器的语法.Guava库和Scala语言都有很多推荐它们,但学习一个全新的库/语言可能会过于苛刻.