使用stream转list为map报错java.lang.IllegalStateException: Duplicate key

一.背景

  在很多场景下,需要将List的数据转化为Map的键值对的场景,方便快速查询数据。例如:需要根据工号查询出对应的人名名称明细场景。有两种实现场景,第一种通过每个工号查询一次数据库循环查询,明显这种方式不合理,因为对DB压力以及连接不利。第二种将工号集合(需要考虑数据量的场景,Oracle支持最大一千条,mysql虽然无上线,但是考虑性能以及内存占用情况需要考虑上限建议1000以下),接下来是以第二种方式进行展开。

二.开发实践

List<User> userList = new ArrayList<>();

userList.add(User.builder().id(123).name("测试123").build());

userList.add(User.builder().id(1231).name("测试1231").build());

userList.add(User.builder().id(1232).name("测试1232").build());

userList.add(User.builder().id(1233).name("测试1233").build());

userList.add(User.builder().id(1234).name("测试1234").build());

1.Java1.8之前不能使用stream流实现方式

Map<String, Long> idNameMap = new HashMap<String, Long>();

for(User user : userList ){

     idNameMap.put(user.getName(),  user.getId());

}

return idNameMap ;

2.Java1.8后支持stream流实现方式

return userList.stream().collect(Collectors.toMap(User::getName, User::getId);

三.存在的问题

如果使用2.1的方式,可能存在的问题,如果存在数据中有两条name相同的数据,则会报错java.lang.IllegalStateException: Duplicate key。

使用stream流的时候,不会像上面方式直接进行数据覆盖,而是报错。所以需要优化成:

return userList.stream().collect(Collectors.toMap(User::getName, User::getId , (entity1, entity2) -> entity1);

可以解决报错问题。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值