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

47

我有两张地图

Map<String, String> filterMap 
Map<String, Object> filterMapObj

我需要的是将 Map<String, String> 转换为 Map<String, Object>。这里我正在使用以下代码

        if (filterMap != null) {
            for (Entry<String, String> entry : filterMap.entrySet()) {
                String key = entry.getKey();
                String value = entry.getValue();
                Object objectVal = (Object)value;
                filterMapObj.put(key, objectVal);
            }
        }

它很好用,是否有其他方法可以在不迭代Map中的所有条目的情况下完成此操作。


如果您想保留两个引用,为什么不使用putAll API方法呢? - Anupam Saini
4个回答

55

不必编写自己的循环来调用 put,而可以使用 putAll 来完成相同的操作:

filterMapObj.putAll(filterMap);

(详见Javadoc文档。)

正如Asanka Siriwardena在他/她的回答中指出的,如果您的计划是在创建filterMapObj之后立即填充它,则可以使用自动执行此操作的构造函数:

filterMapObj = new HashMap<>(filterMap);

但是要明确的是,上述方法与遍历映射元素基本等效:它会使你的代码更加简洁,但如果不想遍历元素的原因实际上是性能问题(例如,如果你的映射非常大),那么这并不太可能帮助你。另一种可能性是编写:

filterMapObj = Collections.<String, Object>unmodifiableMap(filterMap);

创建了一个不可修改的“视图”filterMap。 当然,这更加严格,因为它不允许独立修改filterMapObjfilterMap。 (filterMapObj 不能被修改,对filterMap的任何修改也将影响filterMapObj)。


@PrasadKharkar:我不会说我的解决方案比你的更好,只是它们有不同的用途。(而你的暗示OP可能有一个XY问题。)拥有两者都没有问题。 :-) - ruakh
嗨@ruakh,为什么我们必须返回一个unmodifiableMap才能使转换起作用?Java不能断言一个String,String的集合可以作为String,Object的集合返回吗? - Antonin
2
@Antonin:为了将Map<String, String>转换为Map<String, Object>,确保安全性,某些东西需要确保put方法不会向原始映射添加不适当的映射(请记住,原始映射很可能是HashMap之类的实例,它不进行运行时类型检查)。unmodifiableMap并不是唯一实现这一点的方法,但它是最简单的方法之一(我敢说,通常也是最合适的方法)。 - ruakh
@asanka的回答很简单明了: Map<String, Object> filterMapObj = new HashMap<>(filterMap); - Philippe
@Philippe:好主意。我会加上相关内容的。 - ruakh
使用静态导入和Collections推断泛型类型,代码看起来像这样:final Map<String, Object> filterMapObj = unmodifiableMap(filterMap);;这是简短、清晰的,据我所知,没有性能损失。我认为这是最好的方法。 - Javier Mr

10
你可以使用通配符运算符来实现。将filterMapObj定义为Map<String, ? extends Object> filterMapObj,然后直接将filterMap赋值给它。您可以了解泛型通配符操作符的相关知识。

10
您可以简单地编写:

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

2
这绝对是最简单的答案。我认为它是“最正确”的。 - Philippe
这是对我有效的一个解决方案,只需要一行代码就解决了问题。 - Ezequiel Adrian

1
你可以使用putAll方法来解决这个问题。Object是所有对象的父类,因此你可以在不进行转换的情况下使用putAll。

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