双大括号初始化的替代方案

kaa*_*lan 4 java collections list hashmap double-brace-initialize

我有一个以下形式的嵌套集合:

HashMap<String, HashMap<String, List<String>>> errorList;
Run Code Online (Sandbox Code Playgroud)

现在我使用双括号内联初始化它,如下所示

errorList.put(tempName, new HashMap<String, List<String>>() {{
    put("upl", new ArrayList<String>() {{ add("Y"); add("Upload Success"); }});
}});
Run Code Online (Sandbox Code Playgroud)

tempName这位于 foreach 循环中,每次迭代时值都会发生变化。我这样做是因为我无法使用List<String>or的实例HashMap<String,List<String>>,因为每次我更改该实例中的值时,它都会反映在它嵌套的集合中。所以我被迫使用双括号初始化创建新实例。

事情是:我想使用列表对象。代替

new ArrayList<String>() {{ add("Y"); add("Upload Success"); }}
Run Code Online (Sandbox Code Playgroud)

我想使用一个变量。

我怎样才能做到这一点?

Ole*_*.V. 6

代替:

\n
new ArrayList<String>() {{ add("Y"); add("Upload Success"); }}\n
Run Code Online (Sandbox Code Playgroud)\n

你可以使用:

\n
Arrays.asList("Y", "Upload Success")\n
Run Code Online (Sandbox Code Playgroud)\n

这将为您提供一个固定大小的列表。

\n

或者从 Java 9 开始:

\n
List.of("Y", "Upload Success")\n
Run Code Online (Sandbox Code Playgroud)\n

这为您提供了一个完全不可变的列表。

\n

如果您希望稍后能够修改列表(在前一种情况下,如果您希望能够添加或删除元素),请将其转换为ArrayList

\n
new ArrayList<>(Arrays.asList("Y", "Upload Success"))\n
Run Code Online (Sandbox Code Playgroud)\n

或者

\n
new ArrayList<>(List.of("Y", "Upload Success"))\n
Run Code Online (Sandbox Code Playgroud)\n

当然,您可以先将此列表放入其自己的变量中,然后再将其放入映射结构中。

\n

如果您想放置[Y, Upload Success][N, Upload Failed]并确保列表在映射条目之间共享\xe2\x80\x99t,这里\xe2\x80\x99s 是一个建议:首先,在循环之外:

\n
final List<String> successList = List.of("Y", "Upload Success");\nfinal List<String> failureList = List.of("N", "Upload Failed");\n
Run Code Online (Sandbox Code Playgroud)\n

然后在你的循环中:

\n
if (wasSuccessful) {\n    errorList.put(tempName,\n                  Collections.singletonMap("upl", new ArrayList<>(successList)));\n} else {\n    errorList.put(tempName,\n                  Collections.singletonMap("upl", new ArrayList<>(failureList)));\n}\n
Run Code Online (Sandbox Code Playgroud)\n

或者从 Java 9 开始使用Map.of()

\n
if (wasSuccessful) {\n    errorList.put(tempName,\n                  Map.of("upl", new ArrayList<>(successList)));\n} else {\n    errorList.put(tempName,\n                  Map.of("upl", new ArrayList<>(failureList)));\n}\n
Run Code Online (Sandbox Code Playgroud)\n

您可以将这个想法更进一步,在循环之外构建地图。再说一遍,如果您希望内部映射为HashMap,只需转换为 1:new HashMap<>(Map.of("upl", new ArrayList<>(successList)))

\n

您注意到我完全避免了双括号初始化。虽然它很简短,但它在概念上和性能上都有开销。您每次都会创建一个新的匿名子类,我不\xe2\x80\x99t认为这是有道理的。

\n