java中使用List转Map对象时踩到的坑

博客主要围绕Java中List转Map<Object,Object>展开。当List中有重复对象,直接转换会因键重复报错,因为Map键需唯一。业务中查询出的List有重复对象时,转Map要采用特定方法,保留重复键中的一个,避免报错。
  • List转Map<Object,Object>
Map<Long, UserPoJo> userIdMap = userList.stream().collect(Collectors.toMap(UserPoJo::getId, u -> u,(k1,k2)->k1));
 Map<Long, String> userIdMap =
        userList.stream()
            .collect(Collectors.toMap(UserPoJo::getId, UserPoJo::getName, (k1, k2) -> k1));
  • 编写一个测试List转Map的测试类。
package yooo.yun.com.test;

import yooo.yun.com.user.pojo.UserPoJo;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * @author WangJiao
 * @since 2020/11/01
 */
public class TestMain {

  public static void main(String[] args) {
    List<UserPoJo> userList = new ArrayList();
    UserPoJo user = UserPoJo.of();
    user.setId(222L);
    user.setName("aaa");
    userList.add(user);

    UserPoJo user2 = UserPoJo.of();
    user2.setId(222L);
    user2.setName("aaa");
    userList.add(user2);

    UserPoJo user3 = UserPoJo.of();
    user3.setId(333L);
    user3.setName("aaa");
    userList.add(user3);

    UserPoJo user4 = UserPoJo.of();
    user4.setId(444L);
    user4.setName("aaa");
    userList.add(user4);

    testListToMap(userList);
  }

  public static void testListToMap(List<UserPoJo> userList) {
    // 将List转换为Map
    Map<Long, UserPoJo> userIdMap =
        userList.stream().collect(Collectors.toMap(UserPoJo::getId, u -> u));
    System.out.println("userIdMap: " + userIdMap);
  }
}
  • 上面的List中有两个相同的对象,id 等于222的。
  • 直接使用该方法是会报错的,原因是重复的键,Map中的键是唯一的,不能重复。
  • map 中的key是id,value是对象。
 Map<Long, UserPoJo> userIdMap = userList.stream().collect(Collectors.toMap(UserPoJo::getId, u -> u));
Exception in thread "main" java.lang.IllegalStateException: Duplicate key UserPoJo(id=222, tel=null, password=null, avatar=null, name=aaa, keyOutTime=null, status=null)
	at java.util.stream.Collectors.lambda$throwingMerger$0(Collectors.java:133)
	at java.util.HashMap.merge(HashMap.java:1254)
	at java.util.stream.Collectors.lambda$toMap$58(Collectors.java:1320)
	at java.util.stream.ReduceOps$3ReducingSink.accept(ReduceOps.java:169)
	at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1382)
	at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:482)
	at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:472)
	at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
	at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
	at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499)
	at yooo.yun.com.test.TestMain.testListToMap(TestMain.java:44)
	at yooo.yun.com.test.TestMain.main(TestMain.java:38)
  • 如果业务中查询出的List中的数据有重复的对象,那么在转map时就需要注意了,应使用一下方法来转换,k1,k2代表有重复的键时只保留其中一个,这样就不会报错了。
Map<Long, UserPoJo> userIdMap = userList.stream().collect(Collectors.toMap(UserPoJo::getId, u -> u,(k1,k2)->k1));
  • 输出结果为:
userIdMap: {
444=UserPoJo(id=444, tel=null, password=null, avatar=null, name=aaa, keyOutTime=null, status=null), 
333=UserPoJo(id=333, tel=null, password=null, avatar=null, name=aaa, keyOutTime=null, status=null), 
222=UserPoJo(id=222, tel=null, password=null, avatar=null, name=aaa, keyOutTime=null, status=null)}

Process finished with exit code 0
  • Map中的key为ID,value为name时使用
 Map<Long, String> userIdMap =
        userList.stream()
            .collect(Collectors.toMap(UserPoJo::getId, UserPoJo::getName, (k1, k2) -> k1));

-: 学到这里,你就get到了喔!
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值