java-将Map 转换为Map
如何将Map转换为Map?
这不起作用:
Map map = new HashMap(); //Object is containing String
Map newMap =new HashMap(map);
11个解决方案
37 votes
现在我们有了Java 8 / streams,我们可以在列表中添加一个可能的答案:
假设每个值实际上都是String对象,则强制转换为String应该是安全的。 否则,可以使用其他一些将对象映射到字符串的机制。
Map map = new HashMap<>();
Map newMap = map.entrySet().stream()
.collect(Collectors.toMap(Map.Entry::getKey, e -> (String)e.getValue()));
skeryl answered 2020-01-25T20:38:35Z
27 votes
如果您的Objects仅包含String,则可以这样做:
Map map = new HashMap(); //Object is containing String
Map newMap =new HashMap();
for (Map.Entry entry : map.entrySet()) {
if(entry.getValue() instanceof String){
newMap.put(entry.getKey(), (String) entry.getValue());
}
}
如果不是每个Objects不是String,则可以将(String) entry.getValue()替换为entry.getValue().toString()。
Shreyos Adikari answered 2020-01-25T20:38:11Z
18 votes
泛型类型是编译时的抽象。 在运行时,所有映射都具有相同的27186980426219530530类型。因此,如果您确定值是字符串,则可以在Java编译器上作弊:
Map m1 = new HashMap();
Map m2 = (Map) m1;
将键和值从一个集合复制到另一个是多余的。 但是这种方法仍然不好,因为它违反了泛型类型的安全性。 可能是您应该重新考虑代码以避免此类情况。
Mikhail answered 2020-01-25T20:39:00Z
6 votes
有两种方法可以做到这一点。 一个很简单但是不安全:
Map map = new HashMap();
Map newMap = new HashMap((Map)map); // unchecked warning
另一种方法没有编译器警告,并确保运行时的类型安全,这更加可靠。 (毕竟,您不能保证原始映射仅包含String值,否则为什么不首先是Map?)
Map map = new HashMap();
Map newMap = new HashMap();
@SuppressWarnings(“unchecked”) Map intermediate =
(Map)Collections.checkedMap(newMap, String.class, String.class);
intermediate.putAll(map);
cambecc answered 2020-01-25T20:39:25Z
2 votes
不可能。
这有点违反直觉。
您遇到的是“苹果是水果”但“每个水果都不是苹果”
去创建一个新的地图并检查instance of with String
Suresh Atta answered 2020-01-25T20:39:58Z
2 votes
当您从Object转换为String时,我建议您捕获并报告(以某种方式,这里我只是打印一条消息,通常是不好的)异常。
Map map = new HashMap(); //Object is containing String
Map newMap =new HashMap();
for (Map.Entry entry : map.entrySet()) {
try{
newMap.put(entry.getKey(), (String) entry.getValue());
}
catch(ClassCastException e){
System.out.println("ERROR: “+entry.getKey()+” -> "+entry.getValue()+
" not added, as “+entry.getValue()+” is not a String");
}
}
selig answered 2020-01-25T20:40:18Z
1 votes
虽然您可以通过蛮力投掷和禁止显示警告来做到这一点
Map map = new HashMap();
// Two casts in a row. Note no “new”!
@SuppressWarnings(“unchecked”)
Map newMap = (HashMap)(Map)map;
确实遗漏了整个要点。 😃
尝试将狭窄的泛型类型转换为更广泛的泛型类型意味着您一开始使用的是错误的类型。
打个比方:假设您有一个程序可以进行大量的文本处理。 假设您使用Objects(!!)进行处理的上半部分,然后决定使用正确键入作为String进行下半部分的处理,因此您将广播范围从Object缩小为String。幸运的是,您可以使用Java( 在这种情况下很容易)-但这只是掩盖了您在上半年使用弱输入的事实。 不好的做法,没有理由。
这里没有区别(只是更难投射)。 您应该始终使用强类型。 至少使用一些基本类型-然后可以使用通用通配符(“?Extended BaseType”或“?super BaseType”)来提供类型兼容性和自动强制转换。 更好的是,使用正确的已知类型。 除非您有100%可以真正用于任何类型的通用代码,否则不要使用Object。
希望有帮助! 😃 😃
注意:通用的强类型输入和类型转换仅存在于.java代码中。 编译为.class之后,我们剩下的是原始类型(Map和HashMap),没有通用类型参数,并且没有键和值的自动类型转换。 但这很有帮助,因为.java代码本身是强类型且简洁的。
Glen Best answered 2020-01-25T20:41:07Z
1 votes
以下内容将转换您现有的条目。
TransformedMap.decorateTransform(params, keyTransformer, valueTransformer)
在哪里
MapUtils.transformedMap(java.util.Map map, keyTransformer, valueTransformer)
仅将新条目转换为您的地图
yunspace answered 2020-01-25T20:41:35Z
1 votes
这里的解决方案很棒,只是考虑null832值处理的另一种选择:
Map map = new HashMap<>();
Map stringifiedMap = map.entrySet().stream()
.filter(m -> m.getKey() != null && m.getValue() !=null)
.collect(Collectors.toMap(Map.Entry::getKey, e -> (String)e.getValue()));
Johnny answered 2020-01-25T20:46:01Z
0 votes
private Map convertAttributes(final Map attributes) {
final Map result = new HashMap();
for (final Map.Entry entry : attributes.entrySet()) {
result.put(entry.getKey(), String.valueOf(entry.getValue()));
}
return result;
}
Sky Tronics answered 2020-01-25T20:46:16Z
0 votes
使用Java 8将Map转换为Map的方法。此解决方案可处理null的值。
Map keysValuesStrings = keysValues.entrySet().stream()
.filter(entry -> entry.getValue() != null)
.collect(Collectors.toMap(Entry::getKey, entry -> entry.getValue().toString()));
BJ Peter DeLaCruz answered 2020-01-25T20:46:37Z