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)
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().
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)
将密钥和值从一个集合复制到另一个集合是多余的.但这种方法仍然不好,因为它违反了泛型类型的安全性.也许你应该重新考虑你的代码以避免这些事情.
有两种方法可以做到这一点.一个很简单但不安全:
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)