将Map <String,Object>转换为Map <String,String>

Maw*_*wia 51 java syntax map type-conversion

我怎样才能转换 Map<String,Object>Map<String,String>

这不起作用:

Map<String,Object> map = new HashMap<String,Object>(); //Object is containing String
Map<String,String> newMap =new HashMap<String,String>(map);
Run Code Online (Sandbox Code Playgroud)

ske*_*ryl 37

现在我们有Java 8 /流,我们可以在列表中添加一个可能的答案:

假设每个值实际上都是 String对象,那么转换String应该是安全的.否则,可以使用用于将对象映射到字符串的一些其他机制.

Map<String,Object> map = new HashMap<>();
Map<String,String> newMap = map.entrySet().stream()
     .collect(Collectors.toMap(Map.Entry::getKey, e -> (String)e.getValue()));
Run Code Online (Sandbox Code Playgroud)

  • 额外小心: Map&lt;String,String&gt; newMap = map.entrySet().stream() .filter(entry -&gt; entry.getValue() instanceof String) .collect(Collectors.toMap(Map.Entry::getKey, e -&gt; (String)e.getValue())); (2认同)
  • 为什么不是`e.getValue().toString()` 为什么显式转换? (2认同)
  • @AntonBalaniuc 老问题,但是调用 `toString()` 可能很危险......让我解释一下。如果出于任何原因,您想要转换为 String 的对象实际上不是您期望概括为对象的 String,而是其他东西,则“toString()”方法可能会为您提供该对象的标记化值,从而导致难以检测你的代码中的错误。在这种情况下,强制转换至少会抛出“RuntimeException”。 (2认同)

Shr*_*ari 27

如果你Objects只包含Strings,那么你可以这样做:

Map<String,Object> map = new HashMap<String,Object>(); //Object is containing String
Map<String,String> newMap =new HashMap<String,String>();
for (Map.Entry<String, Object> entry : map.entrySet()) {
       if(entry.getValue() instanceof String){
            newMap.put(entry.getKey(), (String) entry.getValue());
          }
 }
Run Code Online (Sandbox Code Playgroud)

如果Objects不是String那么你可以替换 (String) entry.getValue()entry.getValue().toString().

  • 更好的“String.valueOf”来防止 NullPointerException (3认同)

Mik*_*ail 18

泛型类型是编译时抽象.在运行时,所有映射都将具有相同的类型Map<Object, Object>.因此,如果你确定值是字符串,你可以欺骗java编译器:

Map<String, Object> m1 = new HashMap<String, Object>();
Map<String, String> m2 = (Map) m1;
Run Code Online (Sandbox Code Playgroud)

将密钥和值从一个集合复制到另一个集合是多余的.但这种方法仍然不好,因为它违反了泛型类型的安全性.也许你应该重新考虑你的代码以避免这些事情.


cam*_*ecc 6

有两种方法可以做到这一点.一个很简单但不安全:

Map<String, Object> map = new HashMap<String, Object>();
Map<String, String> newMap = new HashMap<String, String>((Map)map);  // unchecked warning
Run Code Online (Sandbox Code Playgroud)

另一种方式没有编译器警告,并确保在运行时类型安全,这是更健壮的.(毕竟,你不能保证原始地图只包含字符串值,否则为什么它不会Map<String, String>在第一位?)

Map<String, Object> map = new HashMap<String, Object>();
Map<String, String> newMap = new HashMap<String, String>();
@SuppressWarnings("unchecked") Map<String, Object> intermediate =
    (Map)Collections.checkedMap(newMap, String.class, String.class);
intermediate.putAll(map);
Run Code Online (Sandbox Code Playgroud)