如何以最简单的方式将 Map<Object,Object>
转换为 Map<String,String>
?
是否有一种不迭代遍历映射的方法来实现这一点?
谢谢
如何以最简单的方式将 Map<Object,Object>
转换为 Map<String,String>
?
是否有一种不迭代遍历映射的方法来实现这一点?
谢谢
实际答案是:
Map<Object,Object> valueMap = ...;
@SuppressWarnings("unchecked")
Map<String,String> targetMap = (Map)valueMap;
List<Object>
转换为List<String>
(对于Map也适用,只是接口更简单)。从以下代码中,您会期望发生什么事情:List<Object> m = Something;
m.add("Looks good.");
m.add(42);
List<String> s = (List<String>)m; // uhuh, no we don't want that.
String myString = s.get(1); // huh exception here.
List<String>
包含一个整数!以后调试时会很麻烦 - 循环遍历所有变量的额外代码会避免许多头痛,并且几乎不会影响性能。java.util.Properties extends Hashtabl<Object,Object>
,但你想要使用 Map<String,String>
而不是使用 Properties 的 getProperty
方法。所以你必须先进行转换。 - takacsotstringList.stream().map(e -> (Object) e).collect(toList())
?如果我只是将List<String>
强制转换为List<Object>
,会得到什么异常?每个规则都有例外。 - deathangel908如果你想要一些干净的东西,你必须“深入”地转换键和值。
使用Java 8流,这只需要几行代码:
static public Map<String, String> toStringString(Map<? extends Object, ? extends Object> map) {
return map
.entrySet()
.stream()
.collect(Collectors.toMap(
e -> e.getKey().toString(),
e -> e.getValue().toString()
));
}
public Map<String, String> castOnlyStringValues(final Map<String, Object> map) {
return map.entrySet().stream()
.filter(x -> String.class.isAssignableFrom(x.getValue().getClass()))
.map(x -> (Entry<?, ?>) x).map(x -> (Entry<String, String>) x)
.collect(toMap(Entry::getKey, Entry::getValue));
}
在Chris J的答案的基础上,这里展示他的“hack”代码实现,证明它是可行的:
public static void main(String[] args) {
Map<Object, Object> valueMap = new HashMap<Object, Object>();
valueMap.put("foo", "bar");
@SuppressWarnings("unchecked")
Map<String, String> targetMap = (Map<String, String>) ((Object) valueMap); // hack alert!
for (Map.Entry<String, String> entry : targetMap.entrySet()) {
String key = entry.getKey();
String value = entry.getValue();
System.out.println(key + "=" + value); // prints foo=bar :)
}
}
哇!没有运行时异常 :)
Map<String>
可以包含一个整数.. - Voo
Map<String, String>
要先声明为Map<Object, Object>
? - BalusCMap<String, String>
,而被错误地声明为Map<Object, Object>
,那么你就可以直接使用(Map)
进行强制转换(不需要泛型类型参数)。 - BalusC