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

84

如何将 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);

你想要做什么? - lc2817
你传递的对象是一个字符串吗? - Shreyos Adikari
你在这种情况下期望/希望发生什么: Map<String, Object> map = new Map<String, Object>() map.put("key", new Integer(42)); - Shreyos Adikari
在迭代map1(映射)时,将Object转换为字符串并创建一个新的Map,其中包含旧字符串和新转换的字符串。 - Sanath
由于并非每个“Object”都是“String”,因此您可以在“Map”的每个值上调用“toString()”。但这就是您所说的“转换”吗? - user1907906
12个回答

2
我发现使用guava是最简单的方法:
    <dependency>
        <groupId>com.google.guava</groupId>
        <artifactId>guava</artifactId>
        <version>30.1-jre</version>
    </dependency>

那么您可以这样做:
Map<String,Object> map = new HashMap<String,Object>(); 
Map<String,String> newMap = Maps.transformValues(map, Functions.toStringFunction());

1

虽然您可以通过强制转换和抑制警告来实现此目的

Map<String,Object> map = new HashMap<String,Object>();
// Two casts in a row.  Note no "new"!
@SuppressWarnings("unchecked")
Map<String,String> newMap = (HashMap<String,String>)(Map)map;  

那真的错了重点。 :)
试图将一个狭窄的通用类型转换为更广泛的通用类型意味着您在第一次使用错误的类型。
比方说:想象一下,你有一个进行大量文本处理的程序。假设你使用 Objects(!!)进行了前半部分的处理,然后决定使用正确的类型作为 String 进行后半部分的处理,所以你从 ObjectString 进行了缩小类型转换。幸运的是,在 Java 中你可以这样做(在这种情况下很容易)- 但这只是掩盖了你在第一半使用弱类型的事实。不好的实践,没有争论。
这里没有区别(只是更难转换)。您应该始终使用强类型。至少使用一些基础类型 - 然后可以使用通配符("? extends BaseType" 或 "? super BaseType")来提供类型兼容性和自动转换。更好的方法是使用正确的已知类型。除非您有 100% 的通用代码可以真正与任何类型一起使用,否则永远不要使用 Object。
希望对你有所帮助! :) :)

注意: 泛型强类型和类型转换仅存在于 .java 代码中。编译为 .class 后,我们得到没有泛型类型参数的原始类型(Map 和 HashMap),以及键和值的自动类型转换。但这极大地帮助了,因为 .java 代码本身是强类型和简洁的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接