从Map <t>中的Map条目值转换为Set <t>

时间:2018-04-20 17:23:28

标签: java generics

我的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")注释该行是我的最后一个也是最不受欢迎的选项。

3 个答案:

答案 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接口的了解。