Java 如何更改HashMap<;K、 V>;从对象到字符串的值类型?

Java 如何更改HashMap<;K、 V>;从对象到字符串的值类型?,java,dictionary,data-structures,hashmap,type-conversion,Java,Dictionary,Data Structures,Hashmap,Type Conversion,最简单/最好的转换方法是什么 Map<String, Object> Map 到 HashMap 我使用的API有返回映射的方法,但是如果我不必每次都将对象强制转换为字符串,那么就更容易了 还有,这值得做吗?HashMap会比Map更快/更高效吗 我假设我必须循环遍历原始映射并将值复制到新的HashMap 提前谢谢 如果您知道键和值的类型(如),您可以强制转换整个地图: Map<String, String> newMap = (HashMap<String,

最简单/最好的转换方法是什么

Map<String, Object>
Map

HashMap
我使用的API有返回映射的方法,但是如果我不必每次都将对象强制转换为字符串,那么就更容易了

还有,这值得做吗?HashMap会比Map更快/更高效吗

我假设我必须循环遍历原始映射并将值复制到新的HashMap


提前谢谢

如果您知道键和值的类型(如
),您可以强制转换整个地图:

Map<String, String> newMap = (HashMap<String, String>)oldMap;

您可以像其他人提到的那样使用构造函数:

Map<String, String> newMap = new HashMap(oldMap);

在原始类型上使用复制构造函数可以:

HashMap<String, String> hashMap = new HashMap(map);
当执行“System.out.println(hashMap.get(“Bla”).getClass());”时会抛出它

因此,强制转换实际上被延迟了

编辑2:

你可以避免使用

HashMap<String, String> hashMap = (HashMap)map;
在评论1中。它会打印出来

    {aKey=aValue}
Exception in thread "main" java.lang.ClassCastException: Value '42' of key ' aKey' cannot be cast from type java.lang.Integer to type java.lang.String
    at ...
这很好

如果映射中至少有一个字符串到非字符串条目,复制将失败

例如,插入

    map.put("aKey", "aValue");
    map.put("aKey", 42);
在评论1中。它会打印出来

    {aKey=aValue}
Exception in thread "main" java.lang.ClassCastException: Value '42' of key ' aKey' cannot be cast from type java.lang.Integer to type java.lang.String
    at ...
其中显示了字符串到非字符串的条目


我知道这个解决方案并不简单,但它是安全的。

地图是一个界面,所以如果其他地图impl比地图快,你就不能真正停留在这里。为什么要将对象转换为字符串?对象本身真的是字符串吗?或者你在做toString()?向下投射可能非常危险。HashMap是一个映射,所以转换(Map)myHashMap总是很好的。转换(HashMap)myMap并不总是真的。这似乎是一个糟糕的想法对象是字符串,但API使其不明确,因此人们也可以存储其他类型的对象。如果两者都是地图。。那我为什么要在Map对象上使用HashMap呢?我知道这似乎是个坏主意,但对于我的项目来说,这并不是什么大问题,因为我知道它可以是HashMap。我的主要问题是,为什么我应该使用HashMap而不是Map?它更快吗?编译器说“不能从HashMap转换到HashMap”。我被一个
映射卡住了,我想将值类型更改为String(而不是Object)。好吧,这很有意义。但我的主要问题是,有没有办法将
Map
转换为
Map
?我存储的值是字符串,我宁愿在这里强制转换,而不是每次检索值时都转换。为什么不首先使用
String
s?为什么
Object
?@AdamArold因为它是从外部库返回的,而不是从他自己的代码返回的。关于接口和实现之间的差异以及提到我的解决方案,+1;-)谢谢后一种解决方案就是我选择的解决方案。:)当然,
map.toString()
(在
println
调用中隐式使用)的输出在内部调用值的
toString()
方法。这与值获取程序的返回类型无关,OP的问题就是关于此类型。
    Map<String, Object> map = new HashMap<String, Object>();

    // 1

    final Stream<Map.Entry<String, Object>> entries = map.entrySet()
            .stream();

    final Function<Map.Entry<String, Object>, String> keyMapper = (
            Map.Entry<String, Object> entry) -> entry.getKey();

    final Function<Map.Entry<String, Object>, String> valueMapper = (
            Map.Entry<String, Object> entry) -> {
        final Object value = entry.getValue();
        if (value instanceof String) {
            return (String) value;
        } else {
            throw new ClassCastException("Value '" + value + "' of key '"
                    + entry.getKey() + "' cannot be cast from type "
                    + ((value != null) ? value.getClass().getName() : null)
                    + " to type " + String.class.getName());
        }
    };

    final BinaryOperator<String> duplicateHandler = (key1, key2) -> {
        throw new IllegalStateException(String.format("Duplicate key %s",
                key1));
    };

    final HashMap<String, String> hashMap = entries.collect(Collectors
            .toMap(keyMapper, valueMapper, duplicateHandler, HashMap::new));

    System.out.println(hashMap);
    map.put("aKey", "aValue");
    {aKey=aValue}
    map.put("aKey", 42);
Exception in thread "main" java.lang.ClassCastException: Value '42' of key ' aKey' cannot be cast from type java.lang.Integer to type java.lang.String
    at ...