如何对Map Map使用双括号初始化

Vis*_*tna 5 java java-8 java-9

我确实知道,双括号初始化有其自身的隐藏成本,但仍然有一种可能的初始化方法Map<String,Map<String,String>>()

我试过的

Map<String, Map<String, String>> defaultSourceCode = new HashMap<String, Map<String, String>>(){
            {"a",new HashMap<String, String>(){{"c","d"}}}
        };
Run Code Online (Sandbox Code Playgroud)

我知道这是一个不好的做法,但至于实验,我正在尝试。

参考和动机: Arrays.asList还可以用于地图吗?

Rus*_*lan 9

您可以使用Map.of()从java9返回不可变映射的方法:

Map<String, Map<String, String>> map = Map.of("a", Map.of("c", "d"));
Run Code Online (Sandbox Code Playgroud)

Map.ofEntries

Map<String, Map<String, String>> map1 = Map.ofEntries(
        Map.entry("a", Map.of("c", "d"))
);
Run Code Online (Sandbox Code Playgroud)

  • 喜欢它和+1,但是我正在寻找双括号初始化。虽然一如既往的感谢:) (2认同)
  • 在许多情况下,包含20个参数的列表足以使您困惑,哪些是键,哪些是值。有很好的限制条件。“ ofEntries”实际上接受了无限的项目,并明确了哪些是键,哪些是值。 (2认同)

And*_*cus 5

几乎一切都很好,您只需要在双括号中使用方法调用即可:

Map<String, Map<String, String>> defaultSourceCode = new HashMap<String, Map<String, String>>(){
    {put("a",new HashMap<String, String>(){{put("c","d");}});}
};
Run Code Online (Sandbox Code Playgroud)

但是这个答案描述了为什么不应该这样做。

  • @LutzHorn好,这很好地暗示了与此反模式相关的问题。这是创建Serializable类的子类,序列化此类映射将创建对该匿名类的持久引用。当然,添加`serialVersionUID`并不能解决问题(除了您无论如何都不能这样做)。例如,周围类的小变化,例如再次为不同的地图使用此反模式,可能会导致类文件的重新编号,从而使持久性地图无效。更不用说对外部对象和任何捕获的变量的意外引用了…… (2认同)