如何以最简洁的方式将Map<Object,Object>转换为Map<String,String>?
有没有一种方法可以在不遍历map的情况下做到这一点?
谢谢
发布于 2011-10-17 08:47:41
我认为这是一个好主意,解释为什么简单的解决方案不起作用,为什么你永远不应该使用它。
假设您可以将List<Object>转换为List<String> (这同样适用于Map,只是一个更简单的接口)。您希望下面的代码会发生什么情况:
List<Object> m = Something;
m.add("Looks good.");
m.add(42);
List<String> s = (List<String>)m; // uhuh, no we don't want that.
String myString = s.get(1); // huh exception here.现在您确实可以使用波西米亚人/Chris解决方案来破解它,但您基本上破坏了Java的类型系统。你不想让一个List<String>包含一个整数!后面的调试会很有趣-循环所有变量的额外代码将避免许多令人头疼的问题,而且几乎不会成为性能问题。
如果有理由将Map声明为接受对象而不是字符串,有人可能会向其添加任何对象-通常您应该能够通过更好的泛型来避免这种情况。
发布于 2011-10-17 07:56:47
实际答案是:
Map<Object,Object> valueMap = ...;
@SuppressWarnings("unchecked")
Map<String,String> targetMap = (Map)valueMap;发布于 2019-03-20 22:20:11
如果你想要干净的东西,你必须转换成“深度”!键和值。
使用Java 8流,这只需要几行代码:
static public Map<String, String> toStringString(Map<? extends Object, ? extends Object> map) {
        return map
                .entrySet()
                .stream()
                .collect(Collectors.toMap(
                    e -> e.getKey().toString(),
                    e -> e.getValue().toString()
                ));
    }https://stackoverflow.com/questions/7788177
复制相似问题