我有一个以下形式的嵌套集合:
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"); }}
我想使用变量。
我该怎么做?
代替:
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)))
。
免责声明:我尚未编译和测试代码。
您注意到我完全避免了双括号初始化。虽然它很简短,但它在概念和性能方面都有开销。您每次都创建一个新的匿名子类,我认为这是没有道理的。