java 8 stream toMap key的重复问题

这篇具有很好参考价值的文章主要介绍了java 8 stream toMap key的重复问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

问题描述

工作中遇到需要将某个List里面的实体类的两个属性对应起来,比如根据姓名找到年龄,就是将List里面的entity属性解析之后放到Map里。
实体类:

public class Person {
        private String name;
        private Integer age;
        ...省略getter、setter
    }

逻辑:

		Person person = new Person("张三",20);
        Person person1 = new Person("李四",20);
        Person person2 = new Person("张三",20);

        List<Person> list = new ArrayList<Person>(){{
            add(person);
            add(person1);
            add(person2);
        }};

        Map<String, Integer> map = new HashMap<>();
        //常规写法
        for (Person p : list) {
            map.put(p.getName(), p.getAge());
        }
        System.out.println(map);
        //stream 流写法
        Map<String, Integer> collect = list.stream().collect(Collectors.toMap(Person::getName, Person::getAge));
        System.out.println(collect);

单纯常规写法肯定没什么问题,就是后面的key会被覆盖,但是stream流不行,会报错。

Exception in thread "main" java.lang.IllegalStateException: Duplicate key 20

原因分析:

Collectors.toMap这个方法其实是有三个参数的,第一个是key,第二个是value,第三个是发生冲突的合并规则。
默认采用的就是冲突之后抛出异常的处理。

public static <T, K, U>
    Collector<T, ?, Map<K,U>> toMap(Function<? super T, ? extends K> keyMapper,
                                    Function<? super T, ? extends U> valueMapper) {
        return toMap(keyMapper, valueMapper, throwingMerger(), HashMap::new);
    }

解决方案:

只需要加上第三个参数即可

public static <T, K, U>
    Collector<T, ?, Map<K,U>> toMap(Function<? super T, ? extends K> keyMapper,
                                    Function<? super T, ? extends U> valueMapper,
                                    BinaryOperator<U> mergeFunction) {
        return toMap(keyMapper, valueMapper, mergeFunction, HashMap::new);
    }

新代码只需要更改第三个参数即可,会跟常规写法一个效果

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

当然还可以采用Collectors.groupingBy(keyFunction)的写法,但是返回值会是Map<key, List<value>>的形式。这就是新的业务场景了。
附上代码:文章来源地址https://www.toymoban.com/news/detail-816262.html

Map<String, List<Person>> collect1 = list.stream().collect(Collectors.groupingBy(Person::getName));

到了这里,关于java 8 stream toMap key的重复问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • java8 Stream流Collectors.toMap当value为null时报空指针异常(NPE)

    一、问题 在项目测试过程中发现当使用下面这种方法后报空指针异常(NPE): 按理说 HashMap 的 key 和 value 都是可以为 null 的,不应该报 NPE 啊,经过定位分析发现 Map 中有个键值对的 value 为 null 值,在调用 Collectors.toMap 时报了 NullPointerException 。 二、分析 Collectors.toMap 的

    2024年02月15日
    浏览(44)
  • 【JAVA】生产环境kafka重复消费问题记录

    业务系统每周都有定时任务在跑,由于是大任务因此采用分而治之思想将其拆分为多个分片小任务采用 kafka异步队列消费 的形式来减少服务器压力,每个小任务都会调用后台的c++算法,调用完成之后便会回写数据库的成功次数。今天观测到定时任务的分片小任务存在被重复消

    2024年04月12日
    浏览(43)
  • Java开发工作问题整理与记录

        首先 类加@Component注解,使当前类成为bean     然后 定义statis类成员     然后 创建 init()方法,用@PostConstruct注解修饰     最后init()方法中,把需要加载的类复制给static类 导入commons-lang3的jar包 dependency groupIdorg.apache.commons/groupId artifactIdcommons-lang3/artifactId version3.8.1/version

    2024年02月11日
    浏览(47)
  • 利用java语言中的stream流操作判断一个数组中是否有重复元素

    判断数组中是否有重复元素可以说是每一个编程语言初学者都会遇到的题目,常见的各种搜索算法本文不做赘述了,我们这次介绍的是利用java语言中特有的stream流操作来判断通用类型数组是否包含重复元素。 首先我们声明一个泛型方法: 表明该方法适用于所有类型的数组。

    2024年02月12日
    浏览(50)
  • Java8使用stream流给List<Map<String,Object>>分组(多字段key)

    Java8使用 stream流 给ListMapString,Object根据字段key 分组 一、项目场景: 从已得到的List集合中,根据某一元素(这里指map的key)进行分组,筛选出需要的数据。 如果是SQL的话则使用 group by 直接实现,代码的方式则如下: 使用到stream流的 Collectors.groupingBy() 方法。 二、代码实现 1、首

    2024年02月02日
    浏览(65)
  • 记录一下在工作中使用 LayUI bug的问题

    前言: LayUI是一个很老的框架了,经常会碰到一些 bug。不过由于他的轻量级,仍然有一些项目在使用。之前在公司解决的这些 bug,现在有时间发出来,可能会对大家产生一些意义。 layui中 slect form表单元素 不美化显现的问题 layui中美化的表单元素 在渲染完成要添加 form.ren

    2024年02月11日
    浏览(40)
  • 【工作记录】记一次执行npm run dev报错的问题

    记录一个npm run dev 报错的问题。 今天在家里电脑跑npm run dev的时候报错,报错内容如下: 第一时间去找了度娘,也确实解决了,但不得不说网上还是有一些错误的答案的。 这个问题是由于node版本过高导致的,所以有一种方案便是降低node版本,正常来讲17一下就是ok的。 另外一

    2024年02月12日
    浏览(42)
  • java8新特性之toMap的用法——全网独一无二的通俗易懂的讲解

    对于java8的新特性toMap方法,相信有很多人都在工作中用过,接下来就通俗易懂的讲解一下toMap吧 先来看看官网对于toMap方法的解释 toMap有个三个重载的方法,每一个重载方法的详解分别如下 (1)方法1:两个参数 public static T, K, U Collector T, ?, MapK,U toMap(Function? super T, ? extends

    2024年02月08日
    浏览(60)
  • 【工作记录】springboot集成spring-data-elasticsearch访问es及问题解决

    ​ 前文我们介绍了通过可视化爬虫爬取新闻到Mysql库、基于docker-compose的elk集群部署及抽取mysql数据到es的过程,本文我们介绍通过集成springboot和spring-data-elasticsearch客户端完成连接es并查询数据的开发过程以及遇到的问题和解决方案,希望对大家能有所帮助,对文中内容有任何

    2023年04月10日
    浏览(40)
  • 如何解决字典打开和字典的读取,重复问题的避免【Java语言】

    在Java语言中,常用的解决字典打开和读取的方式是使用Map,例如HashMap或TreeMap。这些数据结构可以存储键值对,其中键是唯一的。因此,通过使用Map,可以 避免重复的问题 。 编写代码时需要着重考虑以下几个方面: 定义Map :需要定义一个Map对象来存储键值对,以便后续的

    2024年02月11日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包