iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > JAVA >Java8 Collectors.toMap() 的使用
  • 138
分享到

Java8 Collectors.toMap() 的使用

javajvm面试 2023-09-12 09:09:51 138人浏览 独家记忆
摘要

目录 一、简单介绍用法1:根据某一属性,对对象的实例或属性做映射用法2:根据某一属性,对对象集合进行去重 二、Duplicate key 异常1)异常重现:2)异常截图:3)异常说明:4

目录

一、简单介绍

Collectors.toMap(): jdk8 中提供,用于将 Stream 流转换为 Map。

用法1:根据某一属性,对对象的实例或属性做映射

例如:使用 Stream 想要将集合的某一属性(例如手机号)作为 key,对象本身作为 value,这样我们在根据属性获取实例或实例的其他属性时就可以省去遍历每个对象的时间。

// 获取 手机号-UserInfo 映射Map<String, UserInfo> phoneNumberMap = list.stream().collect(Collectors.toMap(UserInfo::getPhoneNumber(), Function.identity());

用法2:根据某一属性,对对象集合进行去重

原始 JDK8 实现根据某一属性去重:

// 查询数据List<UserInfo> list = userInfoMapper.getList();// 根据 姓名 去重list = list.stream().filter(o -> o.getName() != null).collect(                Collectors.collectingAndThen(Collectors.toCollection(                    () -> new TreeSet<>(Comparator.comparing(UserInfo::getName))), ArrayList<Aoo>::new));

通过 Collectors.toMap() 实现根据某一属性去重:

// 查询数据List<UserInfo> list = userInfoMapper.getList();// 根据 姓名 去重Map<String, UserInfo> collect = list.stream()    .collect(Collectors.toMap(UserInfo::getName, o -> o, (v1, v2) -> v1));list = new ArrayList<>(collect.values());

二、Duplicate key 异常

1)异常重现:

    public static void main(String[] args) {        List<User> list = Arrays.asList(                new User("张三", 15),                new User("张三", 16));        // 获取 姓名-年龄 映射        Map<String, Integer> nameMap = list.stream().collect(Collectors.toMap(User::getName, User::getAge));        System.out.println(nameMap);    }    private static class User {        private String name;        private Integer age;        public User(String name, Integer age) {            this.name = name;            this.age = age;        }        public String getName() {            return name;        }        public Integer getAge() {            return age;        }        @Override        public String toString() {            return "User{" +                    "name='" + name + '\'' +                    ", age=" + age +                    '}';        }    }

2)异常截图:

在这里插入图片描述

3)异常说明:

​ Collectors.toMap() 在 key 重复的时候,是需要指定处理操作的。默认并不会像 HashMap 一样直接对原值进行覆盖。当出现 key 重复但没有指定操作时,就会抛出一个 IllegalStateException 非法声明异常。

4)异常处理:

​ 我们只需要增加第3个参数,指定当 key 重复时需要进行的操作即可:

// 获取 姓名-年龄 映射// 第3个参数会执行 Map.merge() 操作,(v1, v2) -> v1 表示重复时抛弃后面的值Map<String, Integer> nameMap = list.stream()    .collect(Collectors.toMap(User::getName, User::getAge, (v1, v2) -> v1));

​ 运行程序,输出结果如下:

三、Collectors.toMap() 导致的空指针异常

1)异常重现:

    public static void main(String[] args) {        List<User> list = Arrays.asList(                new User("张三", 15),                new User("李四", null));        // 获取 姓名-年龄 映射        Map<String, Integer> nameMap = list.stream()            .collect(Collectors.toMap(User::getName, User::getAge, (v1, v2) -> v1));        System.out.println(nameMap);    }    private static class User {        private String name;        private Integer age;        public User(String name, Integer age) {            this.name = name;            this.age = age;        }        public String getName() {            return name;        }        public Integer getAge() {            return age;        }        @Override        public String toString() {            return "User{" +                    "name='" + name + '\'' +                    ", age=" + age +                    '}';        }    }

2)异常截图:

在这里插入图片描述

3)异常说明:

​ 导致空指针是因为 Collectors.toMap() 底层会调用 HashMap.merge() 方法,在执行 merge() 方法的时候会对 value 进行非空判断,从而抛出异常:

在这里插入图片描述

4)异常处理:

方法一:替换 null 为一个默认值,比如 -1

// 获取 姓名-年龄 映射Map<String, Integer> nameMap = list.stream()    .collect(Collectors.toMap(User::getName, o -> Optional.ofNullable(o.getAge()).orElse(-1), (v1, v2) -> v1));

运行程序,输出结果如下:

方法二:调用 collect() 方法实现

public static void main(String[] args) {    List<User> list = Arrays.asList(        new User("张三", 15),        new User("张三", 16),        new User("李四", null));    Map<String, Integer> nameMap = list.stream()        .collect(HashMap::new, (m, o) -> m.put(o.getName(), userInfo.getAge()), HashMap::putAll);    System.out.println(nameMap);}

运行程序,输出结果如下:

四、总结

​ 综合以上两种异常的出现情况和处理方法,考虑到代码的可读性,最终推荐通过如下方式使用 Collectors.toMap()

// 获取 姓名-年龄 映射Map<String, Integer> nameMap = list.stream()    .collect(Collectors.toMap(User::getName, o -> Optional.ofNullable(o.getAge()).orElse(-1), (v1, v2) -> v1));

整理完毕,完结撒花~





参考地址:

Java 8中Collectors.toMap空指针异常源码分析https://blog.csdn.net/ranxiaotop/article/details/125896100

来源地址:https://blog.csdn.net/qq_33204709/article/details/128058684

--结束END--

本文标题: Java8 Collectors.toMap() 的使用

本文链接: https://www.lsjlt.com/news/404296.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java8 Collectors.toMap() 的使用
    目录 一、简单介绍用法1:根据某一属性,对对象的实例或属性做映射用法2:根据某一属性,对对象集合进行去重 二、Duplicate key 异常1)异常重现:2)异常截图:3)异常说明:4...
    99+
    2023-09-12
    java jvm 面试
  • Java8 Stream collect(Collectors.toMap())的使用
    目录Collectors.toMap的用法三个重载的方法Java8 stream特性 Collectors.toMapCollectors.toMap的用法 在我们实际开发过程中经常...
    99+
    2024-04-02
  • Java8 Collectors.toMap的坑
    按照常规思维,往一个map里put一个已经存在的key,会把原有的key对应的value值覆盖,然而通过一次线上问题,发现Java8中的Collectors.toMap反其道而行之,...
    99+
    2024-04-02
  • Java8中List转Map(Collectors.toMap) 的技巧分享
    前言 在实际项目中我们经常会用到 List 转 Map 操作,在过去我们可能使用的是 for 循环遍历的方式。举个例子: 先定义类: // 简单对象 @Accessors(ch...
    99+
    2024-04-02
  • Collectors.toMap()的基本使用方法
    介绍: 1、Java 8 流的新类 java.util.stream.Collectors 实现了 java.util.stream.Collector 接口,同时又提供了大量的方法对流 ( stream ) 的元素执行 map and ...
    99+
    2023-09-06
    java Powered by 金山文档
  • Java8排序stream.sorted()的使用
        在这个页面上我们将提供java 8 Stream sorted()示例。我们可以按照自然排序以及Comparator提供的排序对流进行...
    99+
    2024-04-02
  • Java8 ArrayList之forEach的使用
    目录Java8 ArrayList之forEach使用一、用法二、效率ArrayList在foreach中remove的问题分析iteratoritr.hasNext 和 itr.n...
    99+
    2024-04-02
  • Java8的LocalDateTime怎么使用
    这篇文章主要讲解了“Java8的LocalDateTime怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java8的LocalDateTime怎么使用”吧!前言LocalDateTi...
    99+
    2023-07-05
  • 使用stream的Collectors.toMap()方法常见的问题及解决
    目录使用stream的Collectors.toMap()方法常见问题在使用过程中有两个小坑需要注意解决方案Stream ToMap(Collectors.toMap) 实践Requ...
    99+
    2023-03-06
    stream Collectors.toMap() Collectors.toMap()方法 使用stream Collectors.toMap()方法
  • 如何使用Java8中的StringJoiner
    这篇文章主要介绍“如何使用Java8中的StringJoiner”,在日常操作中,相信很多人在如何使用Java8中的StringJoiner问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何使用Java8中的...
    99+
    2023-06-15
  • 使用stream的Collectors.toMap()方法常见问题如何解决
    本篇内容介绍了“使用stream的Collectors.toMap()方法常见问题如何解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!使用...
    99+
    2023-07-05
  • Java8中Stream的使用方式
    目录前言:1. 为什么有经验的老手更倾向于使用Stream2. Stream 的使用方式3. Stream 的创建4. Stream 中间操作5. Stream 终止操作6. Str...
    99+
    2024-04-02
  • Java8中CompletableFuture怎么使用
    今天小编给大家分享一下Java8中CompletableFuture怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1...
    99+
    2023-06-29
  • Java8中Stream怎么使用
    今天小编给大家分享一下Java8中Stream怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、概述Java 8 是...
    99+
    2023-07-02
  • Java8 Time Api如何使用
    本篇内容主要讲解“Java8 Time Api如何使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java8 Time Api如何使用”吧!1.概述作为...
    99+
    2023-06-30
  • 详解Java8中CompletableFuture类的使用
    目录创建CompletableFuture处理CompletableFuture的结果处理CompletableFuture的异常总结Java 8中引入了CompletableFut...
    99+
    2023-05-15
    Java8 CompletableFuture类使用 Java8 CompletableFuture类 Java8 CompletableFuture
  • Java8中Optional类的使用说明
    目录简介 历史null带来的种种问题方案 场景引入 方法说明构造函数创建Optional对象使用map从Optional对象中提取和转换值使用flatMap链接Optional对象默...
    99+
    2024-04-02
  • Java8中StringJoiner类的使用详解
    目录Java8 StringJoiner类的构造方法Java8 StringJoiner类的方法分割案例添加前缀和后缀合并两个StringJoinerStringJoiner方法Ja...
    99+
    2022-11-13
    Java8 StringJoiner类使用 Java StringJoiner类 Java StringJoiner
  • Java8中的CompletableFuture类怎么使用
    本篇内容主要讲解“Java8中的CompletableFuture类怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java8中的CompletableFuture类怎么使用”吧!Java...
    99+
    2023-07-06
  • Java8新特性怎么使用
    本篇内容介绍了“Java8新特性怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Java语言新特性Lambda表达式Lambda表达式...
    99+
    2023-06-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作