双括号初始化的替代方案

问题描述 投票:0回答:1

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

HashMap<String, HashMap<String, List<String>>> errorList;

现在我使用像这样的双括号内联初始化它

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

这位于 foreach 循环中,

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

事情是:我想使用列表对象。而不是

new ArrayList<String>() {{ add("Y"); add("Upload Success"); }}

我想使用变量。

我该怎么做?

java list collections hashmap double-brace-initialize
1个回答
5
投票

代替:

new ArrayList<String>() {{ add("Y"); add("Upload Success"); }}

您可以使用:

Arrays.asList("Y", "Upload Success")

这将为您提供一个固定大小的列表。如果您希望稍后能够添加或删除元素,请将其转换为

ArrayList
:

new ArrayList<>(Arrays.asList("Y", "Upload Success"))

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

如果您想放置

[Y, Upload Success]
[N, Upload Failed]
并确保列表不在地图条目之间共享,这里有一个建议:首先,在循环之外:

final List<String> successList = Arrays.asList("Y", "Upload Success");
final List<String> failureList = Arrays.asList("N", "Upload Failed");

然后在你的循环中:

if (wasSuccessful) {
    errorList.put(tempName,
                  Collections.singletonMap("upl", new ArrayList<>(successList)));
} else {
    errorList.put(tempName,
                  Collections.singletonMap("upl", new ArrayList<>(failureList)));
}

您可以将这个想法更进一步,在循环之外构建地图。再说一遍,如果您希望内部地图是

HashMap
,只需转换为:
new HashMap<>(Collections.singletonMap("upl", new ArrayList<>(successList)))

免责声明:我尚未编译和测试代码。

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

© www.soinside.com 2019 - 2024. All rights reserved.