Java 轻松转换地图<;字符串,对象>;映射<;字符串,字符串>;

Java 轻松转换地图<;字符串,对象>;映射<;字符串,字符串>;,java,map,casting,Java,Map,Casting,我正在使用的API有一个返回映射的方法,但我知道在这种情况下对象是字符串,所以我希望它是映射 但出于某种原因,我不能将其强制转换,Java说由于某种原因,Map不能强制转换为Map 我用过: Map<String, Object> tempMap = someApiMethodReturningAMap(); Map<String, String> map = new HashMap<String, String>(); for (String i : tem

我正在使用的API有一个返回
映射的方法,但我知道在这种情况下
对象是
字符串,所以我希望它是
映射

但出于某种原因,我不能将其强制转换,Java说由于某种原因,
Map
不能强制转换为
Map

我用过:

Map<String, Object> tempMap = someApiMethodReturningAMap();
Map<String, String> map = new HashMap<String, String>();
for (String i : tempMap.keySet()) {
    map.put(i, String.valueOf(tempMap.get(i)));
}
Map tempMap=someApiMethodReturningAMap();
Map Map=newhashmap();
for(字符串i:tempMap.keySet()){
map.put(i,String.valueOf(tempMap.get(i));
}
作为一种解决方法,但有更简单的方法吗?

您不能安全地将其强制转换为
映射,因为即使您知道只有字符串作为值,编译器也不会。这就像期待:

Object x = "foo";
String y = x;
工作——它不工作;您需要显式地强制转换

同样,如果通过
对象
,也可以在此处显式强制转换:

Map<String, Object> x = ...;
Map<String, String> y = (Map<String, String>) (Object) x;
Java 8解决方案:

private Map<String, String> stringifyValues(Map<String, Object> variables) {
    return variables.entrySet().stream()
            .collect(Collectors.toMap(Map.Entry::getKey, e -> (String) e.getValue()));
}
私有映射值(映射变量){
返回变量。entrySet().stream()
.collect(Collectors.toMap(Map.Entry::getKey,e->(String)e.getValue());
}

这里有很好的解决方案,但我想添加另一个解决方案,考虑处理
null
值:

Map<String,Object> map = new HashMap<>();

Map<String,String> stringifiedMap = map.entrySet().stream()
             .filter(m -> m.getKey() != null && m.getValue() !=null)
             .collect(Collectors.toMap(Map.Entry::getKey, e -> (String)e.getValue()));
Map Map=newhashmap();
Map stringifiedMap=Map.entrySet().stream()
.filter(m->m.getKey()!=null和&m.getValue()!=null)
.collect(Collectors.toMap(Map.Entry::getKey,e->(String)e.getValue());

这是一种简单易懂的方法,我只建议将强制转换更改为“String.valueOf()”——您需要对对象arg的toString()方法进行有意义的解释。@hovanesyan谢谢,已编辑。
private Map<String, String> stringifyValues(Map<String, Object> variables) {
    return variables.entrySet().stream()
            .collect(Collectors.toMap(Map.Entry::getKey, e -> (String) e.getValue()));
}
Map<String,Object> map = new HashMap<>();

Map<String,String> stringifiedMap = map.entrySet().stream()
             .filter(m -> m.getKey() != null && m.getValue() !=null)
             .collect(Collectors.toMap(Map.Entry::getKey, e -> (String)e.getValue()));