java map 转string_java-将Map <String,Object>转换为Map <String,String>_JW蒋的博客-程序员宝宝

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

智能推荐

Exchange 2007测试之三:安装过程_weixin_33806914的博客-程序员宝宝

教程:测试Exchange Server 2007  尽管现在仍然是公共测试版,但是即将发布的Exchange Server 2007仍然是微软的旗舰消息应用程序的标志性的里程碑。  在这篇指南中,我将通过向你介绍最新版本的Exchange Server和Microsoft Outlook,让你可以进行你的Exchange 2007测试版的测试或者进行准备好进行Exc...

猴子分香蕉_纸上得来终觉浅-的博客-程序员宝宝

猴子分香蕉5只猴子是好朋友,在海边的椰子树上睡着了。这期间,有商船把一大堆香蕉忘记在沙滩上离去。第1只猴子醒来,把香蕉均分成5堆,还剩下1个,就吃掉并把自己的一份藏起来继续睡觉。第2只猴子醒来,重新把香蕉均分成5堆,还剩下2个,就吃掉并把自己的一份藏起来继续睡觉。第3只猴子醒来,重新把香蕉均分成5堆,还剩下3个,就吃掉并把自己的一份藏起来继续睡觉。第4只猴子醒来,重新把香蕉均分成5堆,还剩下4个,...

POJ 4001 -- 4003 2011福州 A,B,C题_9974的博客-程序员宝宝

4001 模拟题,仔细一点可以1A。我的代码有点长,但思路很清楚。View Code #include#includestring.h>bool vis[11][11];int dir[4][2] = {1, 0, -1, 0, 0, -1, 0, 1};int d[8][2] = {2, 1, 2, -1, -2, 1, -2, -1, 1, 2, 1, -2, -1

python编写一个函数计算传入字符串_PYTHON 写函数,计算传入字符串中【数字、字母、空格、以及其他的个数】..._weixin_39955700的博客-程序员宝宝

一.题目描述 请实现一个函数,将一个字符串中的空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. 二.解题思路 1)简单暴力解法,我们可以很容易的想到,碰到一个空格,就加入%20,于是可以从头到尾遍历字符串,碰到空格,首先将后面的所有字符串往后移动2个字符,这样才能空出3个字符位子插入字符“%20”,对于一个长度为n的字符串,...

微机原理第五章笔记整理_巴川笑笑生的博客-程序员宝宝

ARM特点定长操作码,简化译码,便于流水线设计多个通用寄存器,指令不局限于某个特定寄存器操作数地址由寄存器或指令指定,地址自动增减每条数据指令可对算数逻辑单元和位移器控制多寄存器加载存储指令所有指令都可条件执行支持Thumb指令集ARM7具备MPU,将内存空间划分为不同域,实现特权等级访问控制具备MMU,支持虚拟内存Cortex-A面向移动计算等的高性能处理器Cortex-R面向高性能实时应用Cortex-M关注低成本,低功耗应用Corte-M3/M4带SysTick

1.js入门_不畏未来!不念过去的博客-程序员宝宝

入门1.什么是javaScriptjavaScript是世界上最流行的脚本语言一个合格的后端人员,必须要精通javaScriptECMAScript可以理解为是JavaScript的一个标准,但实际上后两者是ECMA-262标准的实现和扩展最新版本已经到es6版本,但大部分浏览器只停留在支持es5代码上,导致开发环境和线上环境版本不一致2.快速入门2.1 引入javaScript&lt;!DOCTYPE html&gt;&lt;html lang="en"&gt;&lt;head&g

随便推点

pgsql截取字符串函数_postgresql——字符串函数_阿卞是宝藏啊的博客-程序员宝宝

字符串函数:postgresql中的字符串函数有:计算字符串长度函数、字符串合并函数、字符串替换函数、字符串比较函数、查找指定字符串位置函数等。1、计算字符串字符数和字符串长度的函数:char_length(str)和length(str)char_length(str)返回值为字符串str所包含的字符个数。一个多字节字符算作一个单字符。例子:使用char_length函数计算字符串字符个数,如:...

润乾报表字符串函数_Kevin-anycode的博客-程序员宝宝

原文:https://blog.csdn.net/mafan121/article/details/52704210字符串函数1.asc()函数说明: 取字符串指定位置的字符的unicode值,如果是ascii字符则返回ascii码 (一般来说,英文字符及其扩展字符都是ascii字符,中文、日文、韩文等 亚洲字符都是unicode字符,ascii字符为8位,unicode字符为16位(其中有...

废旧android手机变短信服务器_vr7jj的博客-程序员宝宝

前言针对有linux基础的用户玩家。正文思路,手机上安装termux、termux-api 、python内网穿透

html首字母大写,javascript实现英文首字母大写_鸣嵩的博客-程序员宝宝

方法一:function replaceStr(str){ // 正则法str = str.toLowerCase();var reg = /\b(\w)|\s(\w)/g; // \b判断边界\s判断空格return str.replace(reg,function(m){return m.toUpperCase()});}function replaceStr1(str){str = str...

推荐文章

热门文章

相关标签