Java中HashMap的字面声明

8

JavaScript 中,你可以按以下方式一次性声明一个 JSON 对象的所有键和值组合...

var myJSON = {
    'key1' : 'value 1',
    'key2' : 'value 2',
    'key3' : 'value 3',
    'key4' : 'value 4',
    'key5' : 'value 5',
    'key6' : 'value 6'
};

我在想是否可以在Java中为HashMaps做类似的事情。

HashMap<String, String> map = new HashMap<String, String>(
    "Key 1", "Value 1",
    "Key 2", "Value 2",
    "Key 3", "Value 3"
);

基本上,我需要这个作为一次性只读的配置,用于我代码的其他部分。我搜索并尝试了几种解决方案,但未能使它们工作。或者是否有更好的方法可以做到这一点?


3
@MarounMaroun 这不是重复。 静态地图并不等同于“文字声明”。 - Suresh Atta
1
@MarounMaroun 已回答 :) - Suresh Atta
1
@MarounMaroun 我也不同意这个观点 :-/ - Suresh Atta
1
@suresh:在我看来,这似乎是一个很好的重复问题。特别是因为你的答案与其中一个答案相同:https://dev59.com/2mw15IYBdhLWcg3wJ4UR#6802512 - Nathan Hughes
@MarounMaroun 因为put方法仍在实例上调用 :) myMap.put("a", "b"); - Suresh Atta
显示剩余2条评论
2个回答

8

尽管{{(双花括号)是一种反模式,但你可以编写类似以下的内容:

HashMap<String, String> map = new HashMap<String, String>(){{
put("Key 1", "Value 1");
put("Key 2", "Value 2");
put("Key 3", "Value 3");    
}};

编辑:

如果你正在寻找更好的方法来放置元素,可以遍历你的 JSON 并在循环中放置键值。


4
@JordiCastilla 或者不!该地图将保存对封闭类的引用,这可能是不希望的... - assylias
1
只是在 "Value 3" 中缺少一个引号.... ;) - Jordi Castilla
@assylias 我的看法...但这是OP提出的方式,我更喜欢你的例子,没错,但OP要求一种类似于JSon的静态方式...而这就是方法... - Jordi Castilla
我确实问过最后是否有更好的解决方案。我猜这是一种解决方案,但最好还是按照assylias的回复去做,对吗?基本上,这只是一个一次性的只读变量。我不会对它进行操作。因此,最希望使用最有效的方法。 - Shahid Thaika
@ShahidThaika 如果您问我“添加元素的最佳方法是什么”,我的答案会有所不同,但我的答案纯粹集中在Java中HashMap的文字声明上 :) - Suresh Atta
显示剩余4条评论

3

Java没有地图字面量的概念,但是你可以轻松编写一个实用程序方法来实现类似的功能。参见这个实现作为示例。然后,您可以使用静态导入来初始化地图:

Map<String, String> map = map("k1", "v1", "k2", "v2");

另一种选择是使用“双括号初始化”语法,但这会创建一个匿名内部类,这不一定是一个好主意。

2
是的..我不喜欢双"{"的解决方案。 - Maroun

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