java map 转string_java-将Map <String,Object>转换为Map <String,String>-程序员宅基地

技术标签: java map 转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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_42350101/article/details/114424472

智能推荐

pytorch与matlab,Pytorch安装 与入门链接-程序员宅基地

文章浏览阅读568次。Pytorch安装 与入门链接发布时间:2018-03-13 15:07,浏览次数:586, 标签:PytorchPytorch安装1)先是Anaconda安装配置,参照原来一篇博客2)Git Clone源代码进入虚拟环境后,采用conda安装:conda install pytorch torchvision -c soumith如果不成功则:那么最后还有一个选择,install from so..._matlab安装pytorch

SpingMVC IReport多数据源交叉报表示例_jaspersoft ireport designer 多数据源-程序员宅基地

文章浏览阅读8.8k次,点赞5次,收藏8次。开始本示例之前,有必要先阅读我先前发布的《SpringMVC与iReport(JasperReports) 5.6整合开发实例》这篇博文,只有熟悉了SpringMVC与iReport的整合基础之后,才能更容易上手本示例教程,因为本示例的重点在于iReport报表_jaspersoft ireport designer 多数据源

angr_angr re-程序员宅基地

文章浏览阅读1k次。angr_angr re

mysql中limit和offset的用法详细介绍_mysql limit offset-程序员宅基地

文章浏览阅读2.2w次,点赞29次,收藏129次。有的时候我们在学习或者工作中会使用到SQL语句,那么介绍一下limit和offset的使用方法。mysql里分页一般用limit来实现,例如:1、select* from user limit 3表示直接取前三条数据2、select * from user limit 1,3;表示取1后面的第2,3,4三条条数据3、select * from user limit 3 offset 1;表示取1后面第2,3,4三条条数据解释:1、当 limit后面跟一个参数的时候,该参数表示要取的数据的数_mysql limit offset

OpenCV3学习(10.1)背景分离 (帧间差分法、背景差分法)_opencv 背景差分-程序员宅基地

文章浏览阅读1.4w次,点赞7次,收藏105次。 背景提取是在视频图像序列中提取出背景,背景就是场景中静止不动的景物。因为摄像机不动,因此图像中的每个像素点都有一个对应的背景值,在一段时间内,这个背景值是比较固定的。背景提取的目标就是根据视频图像序列,找出图像中每一点的背景值。 背景提取有很多算法。针对静止摄像机的帧间差分法、高斯背景差分法,还有针对运动摄像机的光流法等。 一. 帧间差分法相邻帧间图像差分思想:检测出了相邻两帧..._opencv 背景差分

磁共振计算机都是量子技术吗,IBM利用磁共振对单个原子成像,未来用于量子计算机...-程序员宅基地

文章浏览阅读105次。导读:虽然并非是最漂亮的科学设备,这台显微镜能够利用磁共振技术对单个原子成像凤凰网科技讯北京时间 7 月 2 日消息,随着我们的设备尺寸越来越小,越来越复杂,用来制造它们的材料也越来越复杂。这意味着我们必须仔细地开发设计新材料。不同的显微技 ......虽然并非是最漂亮的科学设备,这台显微镜能够利用磁共振技术对单个原子成像凤凰网科技讯北京时间 7 月 2 日消息,随着我们的设备尺寸越来越小,越来越..._核磁共振中运用了量子科技吗

随便推点

solr总结详解教程_key=solr.jvm%3aos.processcpuload&key=solr.node%3ac-程序员宅基地

文章浏览阅读5.6k次,点赞2次,收藏15次。Solr调研总结开发类型全文检索相关开发Solr版本4.2文件内容本文介绍solr的功能使用及相关注意事项;主要包括以下内容:环境搭建及调试;两个核心配置文件介绍;维护索引;查询索引,和在查询中可以应用的高亮显示、拼写检查、搜索建议、分组统计、拼音检索等功能的使用方法。版本作者/修改人日期V1.0gzk2013-06-04 1. Solr 是什么?Solr它是一种开放源码的、基于 Lucene..._key=solr.jvm%3aos.processcpuload&key=solr.node%3acontainer.fs.coreroot.usabl

cocos2d-x ndk adt mac 路径配置_cocos2dx 怎么设置sdk 路径-程序员宅基地

文章浏览阅读1.4k次。export PATH=/bin:/sbin:/usr/local/mysql/binexport PATH=$PATH:/Applications/MacVim-snapshot-68export PATH=$HOME/.rbenv/bin:$PATHexport CLICOLOR=1export LSCOLORS=GxFxCxDxBxegedabagacedexpo_cocos2dx 怎么设置sdk 路径

linux usb声卡 无声音,记一次解决在Ubuntu 18.04下声卡没有声音的经历-程序员宅基地

文章浏览阅读1.6k次,点赞2次,收藏5次。电脑的主板是华硕的B150-PLUS,声卡是瑞昱的intel ALC 887,从Ubuntu 16.04升级到Ubuntu 18.04系统,使用一切正常,但是声卡没有声音。经过查找资料,得出了解决该问题的答案,如果你的Ubuntu 18.04系统也没有声音,可以参考下方的解决方案处理。解决方案1.在Ubuntu 18.04终端中运行以下命令:sudo apt-get remove --purge ..._alc887声卡驱动ubuntu

微信支付-电商收付通开发-02.获取平台证书与图片上传_java实现微信电商收付通get 获取平台证书列表-程序员宅基地

文章浏览阅读3.4k次。文章目录1. 配置类与工具类1.1 okhttp3工具类1.2 微信支付配置类1.3 微信支付工具类2. 获取平台证书与图片上传接口3. 参考链接1. 配置类与工具类引入gradle依赖subprojects { dependencies { ... //微信的apache-httpclient扩展 compile 'com.github.wechatpay-apiv3:wechatpay-apache-httpclient:0.1.5' _java实现微信电商收付通get 获取平台证书列表

queue()方法_queue()-程序员宅基地

文章浏览阅读2.5k次。queue()方法是一个遍历方法,作用是显示或操作在匹配元素上执行的函数队列。刚开始使用这个方法是用它来遍历匹配元素以使用它带有的回调函数来对匹配元素进行操作,在了解到这个方法真正的作用后有点杀鸡用牛刀的感觉。他真正的作用是操作匹配元素上执行的函数队列,其中一点就是在队列末端中放置一个新函数,这点作用正好就被我用来杀鸡了。请注意,当通过 .queue() 添加函数时,我们应当确保最终调用了..._queue()

python3---对windows系统的文件夹与文件属性为隐藏、只读等。os.chdir、os.getcwd、win32api、win32con_python 设置文件 隐藏 只读属性-程序员宅基地

文章浏览阅读4.2k次。python3—对windows系统的文件夹与文件隐藏 参考:python3.4对应下载https://www.jb51.net/softs/416131.html确认是否安装成功,如下:C:\Python34&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;pythonPython 3.4.3 (v3.4.3:9b73f1c3e601, Feb 24 2015, 22:43:06) [MSC v.1600 32 bit (In..._python 设置文件 隐藏 只读属性

推荐文章

热门文章

相关标签