代码之家  ›  专栏  ›  技术社区  ›  Web User

从映射条目值中的列表强制转换为设置

  •  4
  • Web User  · 技术社区  · 6 年前

    我有一个 Map<String,Object> 包含值为的条目 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 回复  |  直到 6 年前
        1
  •  8
  •   k_ssb    6 年前

    您可以执行以下操作:

    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());
    }
    
        2
  •  3
  •   Andy Turner    6 年前

    String 很奇怪,因为在所有对象上都存在一个方法来转换为它,即 Object.toString() .调用 toString() 字符串返回自身。

    所以,如果你知道 List<?> ,可以转换为 Set<String> 具体如下:

    List<?> list = (List<?>) map.get("some key");
    Set<?> set = list.stream().map(Object::toString).collect(Collectors.toSet());
    

    (您可能需要处理null元素)

        3
  •  -2
  •   TCat    6 年前

    您不能从列表中“投射”<&燃气轮机;设置(<)>;这些是具有不同方法的不同接口。但你可以改为。。。

    Set<String> set = new HashSet<String>();
    set.addAll(map.get("someKey"));
    

    这充分利用了addAll对集合接口的了解。