【业务功能篇35】Java Stream流 :Collectors.toMap

文章讲述了在Java中如何使用StreamAPI结合Collectors.toMap方法将一个List<Dto>对象集合转换为Map集合,特别是在处理可能出现的key重复问题时的解决策略。示例包括根据对象的特定字段生成Map以及处理key冲突的第三个参数的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

业务场景:我们经常会把一个list<Dto>  对象类集合,转换成一个map集合,例如一个问题单集合 list<proVo>, 我们需要转换成 一个map集合,key就指定 问题单类的某个字段,比如问题单号 no, value值就是对应的整个问题单类对象,{"no001":问题单类 包含全部属性信息} ,那么就可以用到Collectors.toMap 的流式处理方法了,将list流转换成map集合

 举例:

1.问题表单集合 list<proVo>,进行转换

  • 第一个参数:proVo::getId, 表示选择proVo的Id作为map的key值;
  • 第二个参数:t->t  表示选择将原来的对象作为Map的value值
  • 第三个参数:(a,b)->a中,如果a与b的key值相同,选择a作为那个key所对应的value值,a参数在前面,表示是前一个集合元素,按前一个元素的值来覆盖。也可以选择b,也就是集合中较后的元素的值来覆盖。避免key重复而报错,所以重复key的时候,需要第三个参数指定
//根据 问题单id 和 问题名称name 将其转成 Map 集合
//形如: {"no01":"测试问题", "mo02":"生产问题"}
Map<Long, String> map = list.stream().collect(Collectors.toMap(proVo::getId, proVo::getName)); 


//根据 id 和 对象自己 转成 Map 集合
//这里的 Function.identity() 等价于 t -> t,也可以写成这种形式,就是将对象自己返回。
Map<Long, proVo> map = list.stream().collect(Collectors.toMap(proVo::getId, Function.identity()));

2.防止key重复报错


一般toMap时只用到两个参数,第一个设定Key,第二个设定value。但如果Key重复的话,那就需要用到第三个参数,可以这么写(k1, k2)-> k1。
什么意思呢,就是说如果k1和k2的key都相同,那么只取k1的值去覆盖之前的值,也可以改为取k2的值,这样就解决了duplicate key的问题
如果重复了key值,而没有设定第三个参数解决重复问题,就会报错
 
Map<Long, String> map = list.stream().collect(Collectors.toMap(proVo::getId, proVo::getName, (k1, k2) -> k1));

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值