专栏首页关忆北.Java8 Collectors.toMap的key重复

Java8 Collectors.toMap的key重复

**

Map<String, BottomAccount> map = bottomAccountList.stream().collect(Collectors.toMap(BottomAccount::getGoodName, Function.identity()));

如这个地方,如果使用GoodName为map的key,货物名称有可能会重复,这时候就会报Duplicate Key的问题,其实是map的key重复了,首先查看源码:

显而易见,throwingMerger()是一个出现异常时默认执行的方法,可以看到,入参是HashMap,大胆猜测、小心求证,我们猜最终是由HashMap去执行的Merger方法,

看HashMap里的一段代码:

这就能证明当出现map的key重复时会报错Duplicate Key的异常了。

如果不想抛异常,自己给传一个新的key值用于替换原有值。

所以,

解决方案一 :给重复的Key设置一个新的值

Map<Integer, String> map = list.stream().collect(Collectors.toMap(Person::getId, Person::getName,(oldValue, newValue) -> newValue));

但是考虑到实际业务中,给重复的key设置一个新的值并不符合需求,所以,

解决方案二:使用其他字段为map的key,如主键id

Map<String, BottomAccount> map = bottomAccountList.stream().collect(Collectors.toMap(BottomAccount::getId, Function.identity()));

原来的map中的key就变成了value

map.values().stream().map(BottomAccount::getGoodName).collect(Collectors.toList())
本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!
本文分享自作者个人站点/博客:https://blog.csdn.net/weixin_42313773复制
如有侵权,请联系 cloudcommunity@tencent.com 删除。
登录 后参与评论
0 条评论

相关文章

  • Java8 Collectors.toMap的坑

    按照常规思维,往一个map里put一个已经存在的key,会把原有的key对应的value值覆盖,然而通过一次线上问题,发现Java8中的Collectors.t...

    欠扁的小篮子
  • Java8 dubbo 调用 Collectors.toMap代码片发生的异常(IllegalStateException: Duplicate key)

    然后,这段代码是被dubbo中的线程执行的,所以,当时只抛了一句话,并没有堆栈信息,后面的日志都没有打印。以至于线程无缘无故后面的都不执行了,线程直接挂掉。

    MickyInvQ
  • Java8合并两个Map中元素的正确姿势

    英文原文地址:https://www.baeldung.com/java-merge-maps

    明明如月学长
  • Java8中list转map方法总结

    botkenni
  • 我在工作中用到的Java8

    在工作中,陆陆续续使用到了Java8的新技术,其中流使用的最多,在处理集合方面非常方便,下面是是我工作中常用到的Java8的功能。

    Lvshen
  • JDK8 stream toMap() java.lang.IllegalStateException: Duplicate key异常解决(key重复)

    测试又报bug啦 接到测试小伙伴的问题,说是一个接口不返回数据了,好吧,虽然不是我写的接口任务落到头上也得解决,本地调试了一下,好家伙,直接抛了个异常出来,这又...

    程序员十三
  • Java8-对List转换Map、分组、求和、过滤

    在java8之后我们list转map再也不用循环put到map了,我们用lambda表达式,使用stream可以一行代码解决,下面我来简单介绍list转map的...

    胖虎
  • Java8使用Stream实现List中对象属性的合并(去重并求和)

    在需求开发中,我们需要对一个List中的对象进行唯一值属性去重,属性求和,对象假设为Pool,有name、value两个属性,其中name表示唯一值,需要val...

    一个正经的程序员
  • java8 Lambda Stream collect Collectors 常用实例

    字典查询和数据转换 toMap时,如果value为null,会报空指针异常 解决办法一:

    Erwin
  • Java8用起来,你的代码将会简化很多

    Java8已经诞生好几年了,但我相信很多小伙伴并不熟悉Java8的特性,并将这些特性使用到工作中去。下面介绍一些我使用Java8的一些经验,真的将我的代码简化了...

    Lvshen
  • 强大的 Stream 函数式编程

    Java8(又称为 Jdk1.8)是 Java 语言开发的一个主要版本。Oracle 公司于 2014 年 3 月 18 日发布 Java8,它支持函数式编程,...

    BUG弄潮儿
  • Java8 用 Stream 快速实现List转Map 、分组、过滤等操作

    这篇文章主要介绍了java8快速实现List转map 、分组、过滤等操作,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友...

    搜云库技术团队
  • 深度探秘 Java 8 函数式编程(下)

    函数编程的一大益处,是用更精练的代码表达常用数据处理模式。函数接口能够轻易地实现模板方法模式,只要将不确定的业务逻辑抽象成函数接口,然后传入不同的lambda表...

    芋道源码
  • Java8 快速实现List转map 、分组、过滤等操作

    利用java8新特性,可以用简洁高效的代码来实现一些数据处理。定义1个Apple对象:

    用户1289394
  • Java8StreamAPI实例

    filter内部使用的是lamda表达式,也是Java8的功能,o代表集合中每一个元素,o>5表示这个元素的值若大于5就返回true,就获取结果。collect...

    崔笑颜
  • LeetCode38|根据字符出现频率排序

    键值对集合的使用,不过也使用了java8的一些语法,这里的代码是不是看着都简洁了很多,可能会有人说可读性不友好,相信你熟练使用java8的语法时,这看着还是比较...

    码农王同学
  • Java8之Stream之List转Map有哪些坑

    王小明_HIT
  • 4.1.java8新特性持续更新

    记得我在以前找工作的经历中,遇到过一个面试官问过我一个很基础的问题。问题是:有一个List中有10个元素,我现在想从中删除3个元素,请问怎么做?我...

    itjim

扫码关注腾讯云开发者

领取腾讯云代金券