java map 转string_java-将Map <String,Object>转换为Map <String,String>

java map 转string_java-将Map <String,Object>转换为Map <String,String>java-将Map转换为Map如何将Map转换为Map?这不起作用:Mapmap=newHashMap();//ObjectiscontainingStringMapnewMap=newHashMap(map);11个解决方案37votes现在我们有了Java8/streams,我们可以在列表中添加一个可能的答案:假设每个值实际上都是String对象,则强制转换为…

大家好,又见面了,我是你们的朋友全栈君。

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/142831.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 局部敏感哈希(LSH)之simhash和minhash

    局部敏感哈希(LSH)之simhash和minhash

    2021年11月22日
    56
  • linux系列之常用运维命令整理笔录

    本博客记录工作中需要的linux运维命令,大学时候开始接触linux,会一些基本操作,可是都没有整理起来,加上是做开发,不做运维,有些命令忘记了,所以现在整理成博客,当然vi,文件操作等就不介绍了,慢慢积累一些其它拓展的命令,博客不定时更新free-m其中:m表示兆,也可以用g,注意都要小写Men:表示物理内存统计total:表示物理内存总数(total=used+free)use…

    2022年4月7日
    38
  • python 字符串 转义_python转义字符怎么用

    python 字符串 转义_python转义字符怎么用问题与背景python的字符串控制,有时候自动转义会带来很多问题,比如文件路径因为转义变得有异常,json字符串塞进json串中之后,自动的对引号加转义斜杠等,整理一下踩的一些坑。参考资料https://www.cnblogs.com/klobohyz/archive/2012/06/04/2535057.htmlpython使用r进行不转义字符串https://www.cnblogs.com/itdyb/p/5046415.htmlPython中的repr()函数解决方案与案例字

    2025年6月12日
    8
  • [原创] debian 9.3 搭建Jira+Confluence+Bitbucket+crowd+seafile (零) 修改端口的问题

    [原创] debian 9.3 搭建Jira+Confluence+Bitbucket+crowd+seafile (零) 修改端口的问题

    2021年6月9日
    89
  • vue路由懒加载实现_vue路由懒加载实现原理

    vue路由懒加载实现_vue路由懒加载实现原理某些情况下,一个页面的path路径可能是不确定的,比如我们进入用户界面时,希望是如下的路径:/user/aaaa或/user/bbbb。p除了有前面的/user之外,后面还跟上了用户的ID。这种path和Component的匹配关系,我们称之为动态路由(也是路由传递数据的一种方式)。1、配置router2、使用路由3、创造用户组件并使用传进来的用户信息在compute中用this.$route.params.userId,但是mustache语法中直接$route.pa

    2022年10月7日
    0
  • DVD基础知识

    DVD基础知识感谢‘高人’提供信息本贴的源由是‘hardjoy’碟友的一个提意,说是要弄一个基础知识简介,然后由‘杜比环绕声’版主支持列出了一些基础知识的问题,本人不才,愿就所学逐一介绍,但现在没有时间查书寻求标准答案了,只能想到哪说到哪了,不见得完全准确,大家就对付着看吧。问:有个叫什么磨码什么的是啥意思,好像是说盘基的答:你说的对,通常‘磨码’和‘盘基’是连起来说的,即‘磨码盘基’,同义词还有‘烫码盘基’和

    2022年7月11日
    14

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号