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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • web UI自动化之PO模式

    web UI自动化之PO模式PO是什么:PO模式,PageObject的缩写,页面对象,设计框架的思想,分层思想在PO下,应用程序的每一个页面都有一个对应的pageclass每一个pageclass维护着该web页的元素集和操作这些元素的方法pageclass中的方法命名最好根据对应的业务场景进行,例如通常登录后我们需要等待几秒钟PO的优势:PO提供了一种业务流程与页面元素操作分离的模式,这使得测试代码变得更加清晰页面对象与用例分离,使得我们更好的复用对象可复用的页面方法代码会变得更加优化更加有效的命名

  • petalinux笔记[通俗易懂]

    petalinux笔记[通俗易懂]记录一下这两天用正点原子开发板学petalinux的过程,众所周知,ZYNQ可以跑逻辑的FPGA,也可以跑裸机的SDK代码,还能跑个linux系统。在SDK开发中,只是在塔好的FPGA上跑一些简单的c代码,还没有安装上一个系统。1.首先是petalinux2018.3版本的安装建议参考正点原子的安装方法,注意事项就是使用ubuntu16.04版本而不是ubuntu18。要么就用ubuntu16.04配上petalin2018.3版本,要么就是ubuntu18配上pet…

  • Windows 7下安装MongoDB

    Windows 7下安装MongoDB

  • JDK新特性-Lambda表达式的神操作

    JDK新特性-Lambda表达式的神操作

    2020年11月20日
  • 领峰:贵金属入门投资规则有哪些?这些重要吗?

    领峰:贵金属入门投资规则有哪些?这些重要吗?如今许多年轻人都会选择用投资的方式进行理财,这样可以用闲钱生钱,贵金属是投资市场当中比较受欢迎的一种产品。因为贵金属的高杠杆和国际性可以让大家的盈利空间更大一点,我们只需要懂得里面的规律和走势就可以成功,那么可能亏损的几率会大大增加,今天就一起来看一下贵金属入门投资规则都有哪些?  价格受哪些方面影响  贵金属入门投资规则还是蛮多的,就如投资者应该先了解一下,都有哪些因素会影响到贵金属价格,这一点算是大家的必修课。在整个投资市场中品种不同的产品,它的投资特点是完全不同的,贵金属也是这个样子,所以我们

  • redhat7.4配置本地yum源_centos7yum源的配置

    redhat7.4配置本地yum源_centos7yum源的配置1.定位到yum的配置文件[root@linuxprobe~]#cd/etc/yum.repos.d/2.查看是否有配置文件[root@linuxprobeyum.repos.d]#ls3.检查yum是否安装,以及安装了哪些依赖源并删除yum包[root@linuxprobeyum.repos.d]#rpm-qa|grepyum显示如下(根据各自情况,有可能不…

发表回复

您的电子邮箱地址不会被公开。

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