如何添加到HashMap中的转换列表?

时间:2018-03-21 21:37:42

标签: java casting mutate

我有一个Map<String, Object>,其中一个值是List<String>。目前,我有:

if (!data.containsKey(myVar)) {
  List<String> emp = new ArrayList();
  data.put(myVar, emp); // myVar is a String
} else {
  data.get(myVar).add(otherVar); // "add" gives an error; otherVar is a String
}

我目前的解决方案是

} else {
  @SuppressWarnings("unchecked")
  List<String> vals = (List<String>) data.get(myVar);
  vals.add(otherVar);
  data.put(myVar, vals);
}

有更好的解决方案吗?

1 个答案:

答案 0 :(得分:1)

除非您可以将Map<String, Object>更改为Map<String, List<String>>,否则没有更好的解决方案。你需要一个演员。您当然可以添加instanceof个检查并将其解压缩到辅助方法,但最终需要进行转换。

但有一件事:您不需要在地图中执行另一个put - vals.add(otherVar)修改已在地图中的List,它不会返回新的列表实例。

关于单行(转换为List<String>并在同一行中执行add) - 这不是很好,因为那时你要么必须容忍“未经检查的强制转换”编译器警告,或者您必须将@SuppressWarnings("unchecked")放在方法级别,这可能会在方法中抑制此类型的其他警告。

修改

  

地图要么具有字符串或列表作为其值

在这种情况下,您可以考虑将数据结构更改为Map<String, List<String>>。由单个元素组成的列表完全有效:)

然后代码变得非常简单。在Java 8中,它是一个单行:

data.computeIfAbsent(myVar, key -> new ArrayList<>()).add(otherVar);