【问题标题】:Alternative to double brace initialization双括号初始化的替代方案
【发布时间】:2017-10-09 01:10:05
【问题描述】:

我有一个嵌套集合,格式如下:

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&lt;String&gt;HashMap&lt;String,List&lt;String&gt;&gt; 的实例,因为每次我更改该实例中的值时,它都会反映在它嵌套的集合中。所以我不得不用双括号创建新实例初始化。

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

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

我想使用一个变量。

我该怎么做?

【问题讨论】:

  • 如果你想使用一个变量,你为什么不直接做呢?
  • 恐怕我还没有完全理解你的问题。请问create a Minimal, Complete, and Verifiable example好吗?
  • 这段代码至少是可怕的,你应该有对象而不是那么多集合。这是无法维护的。
  • 我只是在 spring 控制器中使用它,以便我可以传递错误列表来填充视图(jsp)中的错误表。范围在该控制器方法和视图内。我认为这个数据对象将在视图方面赋予我很大的灵活性。

标签: java list collections hashmap double-brace-initialize


【解决方案1】:

代替:

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&lt;&gt;(Collections.singletonMap("upl", new ArrayList&lt;&gt;(successList)))

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

【讨论】:

  • 你能告诉我singletonMap在这段代码中做了什么吗?内部哈希图还有其他键(其中 4 个)。它们代表了一些上传数据中存在的不同错误类型
  • 咨询the Collections documentation 最容易回答这样的问题。是的,既然您想在其中添加更多元素,请按照我的描述将其转换为 HashMap
猜你喜欢
  • 1970-01-01
  • 2017-07-24
  • 2012-08-28
  • 1970-01-01
  • 2015-06-04
  • 2010-10-29
相关资源
最近更新 更多