首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java -投射地图

Java -投射地图
EN

Stack Overflow用户
提问于 2011-10-17 07:53:14
回答 5查看 32.5K关注 0票数 20

如何以最简洁的方式将Map<Object,Object>转换为Map<String,String>

有没有一种方法可以在不遍历map的情况下做到这一点?

谢谢

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-10-17 08:47:41

我认为这是一个好主意,解释为什么简单的解决方案不起作用,为什么你永远不应该使用它。

假设您可以将List<Object>转换为List<String> (这同样适用于Map,只是一个更简单的接口)。您希望下面的代码会发生什么情况:

代码语言:javascript
运行
复制
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声明为接受对象而不是字符串,有人可能会向其添加任何对象-通常您应该能够通过更好的泛型来避免这种情况。

票数 9
EN

Stack Overflow用户

发布于 2011-10-17 07:56:47

实际答案是:

代码语言:javascript
运行
复制
Map<Object,Object> valueMap = ...;
@SuppressWarnings("unchecked")
Map<String,String> targetMap = (Map)valueMap;
票数 12
EN

Stack Overflow用户

发布于 2019-03-20 22:20:11

如果你想要干净的东西,你必须转换成“深度”!键和值。

使用Java 8流,这只需要几行代码:

代码语言:javascript
运行
复制
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()
                ));
    }
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7788177

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档