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

Posted

技术标签:

【中文标题】将 Map<String,String> 转换为 Map<String,Object>【英文标题】:Converting Map<String,String> to Map<String,Object> 【发布时间】:2014-01-29 00:14:09 【问题描述】:

我有两张地图

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

我需要将Map&lt;String, String&gt; 转换为Map&lt;String, Object&gt;。 这里我用的是代码

        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);
            
        

它工作正常,有没有其他方法可以在不遍历地图中的所有条目的情况下做到这一点。

【问题讨论】:

为什么不使用 putAll api 方法,以防您想保留两个引用。 【参考方案1】:

您可以使用putAll,而不是编写自己的循环来调用put,它做同样的事情:

filterMapObj.putAll(filterMap);

(见the Javadoc。)

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

filterMapObj = new HashMap<>(filterMap);

但需要明确的是,以上内容或多或少等同于遍历地图的元素:它会使您的代码更清晰,但如果您不想遍历元素的原因实际上是性能问题(例如,如果您的地图很大),那么它不太可能对您有所帮助。另一种可能是这样写:

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

它创建了filterMap 的不可修改的“视图”。当然,这更具限制性,因为它不允许您单独修改filterMapObjfilterMap。 (filterMapObj 不能修改,对filterMap 的任何修改都会影响filterMapObj。)

【讨论】:

@PrasadKharkar:我不会说我的解决方案比你的更好,只是它们的用途不同。 (而您的暗示暗示 OP 可能存在 XY 问题。)两者兼而有之没有错。 :-) 嗨@ruakh,为什么我们必须返回一个不可修改的地图才能使演员表工作? java不能断言String的集合,例如String的集合可以作为String,Object的集合返回吗? @Antonin:为了安全起见,从Map&lt;String, String&gt;Map&lt;String, Object&gt; 的“转换”,something 需要确保put 方法永远不会添加不适当的映射到原始地图(请记住,原始地图很可能是不进行运行时类型检查的 HashMap 之类的实例)。 unmodifiableMap 不是实现这一目标的唯一方法,但它是最简单的方法之一(我敢说,通常是最合适的)。 @asanka 的回答很简单:Map&lt;String, Object&gt; filterMapObj = new HashMap&lt;&gt;(filterMap); @Philippe:好点。我会补充一点。【参考方案2】:

你可以简单地写

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

【讨论】:

这是迄今为止最简单的答案。我会投票赞成它是“最正确的”。【参考方案3】:

你可以使用putAll方法来解决这个问题。Object是所有对象的父类,所以你可以使用putAll而不用转换。

【讨论】:

【参考方案4】:

您可以为此使用通配符运算符。 将filterMapObj定义为Map&lt;String, ? extends Object&gt; filterMapObj,您可以直接将filterMap赋值给它。你可以了解generics wildcard operator

【讨论】:

以上是关于将 Map<String,String> 转换为 Map<String,Object>的主要内容,如果未能解决你的问题,请参考以下文章

Java 8:将 Map<String, List<String>> 转换为 Map<String, String[]> [重复]

如何将map<string list<>>转换成城map<string,object>

Java 将 Map<String,Set<String>> 转换为 Map<String,Set<Object1>> [关闭]

将Map<String,Object>格式转换成Map<String ,String[]>格式

将 Map<String, String> 转换为 POJO

如何将mapobject转换成string