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

arj*_*ncc 37 java string optimization hashmap map

我有两张地图

Map<String, String> filterMap 
Map<String, Object> filterMapObj
Run Code Online (Sandbox Code Playgroud)

我需要的是我想将其转换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);
            }
        }
Run Code Online (Sandbox Code Playgroud)

它运行正常,有没有其他方法可以做到这一点,而无需迭代地图中的所有条目.

rua*_*akh 43

你可以使用putAll:

filterMapObj.putAll(filterMap);
Run Code Online (Sandbox Code Playgroud)

(见Javadoc.)

编辑添加:我应该注意上面的方法或多或少等同于迭代地图的元素:它会使你的代码更清晰,但如果你不想迭代元素的理由实际上是一个性能问题(例如,如果你的地图是巨大的),那么它不太可能帮助你.另一种可能性是写:

filterMapObj = Collections.<String, Object>unmodifiableMap(filterMap);
Run Code Online (Sandbox Code Playgroud)

这创造了一个不可修改的"观点" filterMap.当然,这更具限制性,因为它不会让你修改filterMapObjfilterMap独立.(filterMapObj不能修改,任何修改filterMap也会影响filterMapObj.)

  • @Antonin:对于从`Map <String,String>`到`Map <String,Object>`的"强制转换"是安全的,*某些东西*需要确保`put`方法永远不会添加不适当的映射到原始map(请记住,原始地图很可能是像HashMap`那样不进行运行时类型检查的实例).`unmodifiableMap`不是实现这一目标的唯一方法,但它是最简单的(而且,我敢说,通常是最合适的). (2认同)

Pra*_*kar 9

您可以使用通配符运算符.定义filterMapObjMap<String, ? extends Object> filterMapObj,您可以直接分配filterMap给它.您可以了解泛型通配符运算符


Asa*_*ena 5

你可以简单地写

Map<String, Object> filterMapObj = new HashMap<>(filterMap);
Run Code Online (Sandbox Code Playgroud)

  • 这是迄今为止最简单的答案。我会投票支持它“最正确”。 (2认同)