我有一个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);
}
有更好的解决方案吗?
答案 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);