我的Map<String,Object>
条目包含值List<String>
。我需要将List<String>
的内容转换为Set<String>
。我使用以下代码:
Map<String, Object> map = SomeObj.getMap();
if (map.get("someKey") instance of List<?>) {
Set<String> set = new HashSet<String>((List<String>) map.get("someKey"));
}
我的基于Eclipse的IDE在这一行上有几个警告:
代码编译并按预期运行。有没有更好的方法来做到这一点?使用@SuppressWarnings("unchecked")
注释该行是我的最后一个也是最不受欢迎的选项。
答案 0 :(得分:8)
您可以执行以下操作:
Map<String, Object> map = SomeObj.getMap();
String key = "someKey";
if (map.get(key) instanceof List<?>) {
List<?> list = (List<?>) map.get(key);
Set<String> set = new HashSet<>();
// Cast and add each element individually
for (Object o : list) {
set.add((String) o);
}
// Or, using streams
Set<String> set2 = list.stream().map(o -> (String) o).collect(Collectors.toSet());
}
答案 1 :(得分:3)
String
很奇怪,因为所有对象都存在转换为它的方法,即Object.toString()
。在String上调用toString()
会返回自身。
因此,如果您知道它是List<?>
,则可以转换为Set<String>
,如下所示:
List<?> list = (List<?>) map.get("some key");
Set<?> set = list.stream().map(Object::toString).collect(Collectors.toSet());
(您可能需要处理null元素)
答案 2 :(得分:-2)
你不能从List&lt;&gt;“施放”设置&lt;&gt ;;这些是不同方法的不同界面。但你可以改为......
Set<String> set = new HashSet<String>();
set.addAll(map.get("someKey"));
这利用了addAll对Collection接口的了解。