返回顶部
首页 > 资讯 > 精选 >使用stream的Collectors.toMap()方法常见问题如何解决
  • 260
分享到

使用stream的Collectors.toMap()方法常见问题如何解决

2023-07-05 09:07:17 260人浏览 独家记忆
摘要

本篇内容介绍了“使用stream的Collectors.toMap()方法常见问题如何解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!使用

本篇内容介绍了“使用stream的Collectors.toMap()方法常见问题如何解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

    使用stream的Collectors.toMap()方法常见问题

    java8开始的流式编程很大程度上简化了我们的代码,提高了开发效率。

    我们经常会使用到stream的Collectors.toMap()来将List转换Map

    在使用过程中有两个小坑需要注意

    java.lang.IllegalStateException: Duplicate key

    java.lang.NullPointerException

    第一个是由于在List转Map过程中Map集合的key重复导致的;

    第二个是由于在List转Map过程中Map集合的value有null导致的(当存在value值为空时,使用Collectors.toMap()会报NPE,因为底层调用了Map的merge方法,而map方法规定了此处的vlue不能为null,从而抛出空指针异常);

    解决方案

    Collectors.toMap(dto ->key值 , dto -> dto,(v1,v2) -> v1)

    在后面添加(v1,v2)->v1 指定选取第一个值 当key值重复的时候,根据情况而定选取第一个还是第二个)

    自定义一个Map来接收,不使用Collectors.toMap()

    使用stream的Collectors.toMap()方法常见问题如何解决

    第一种情况示例:

    import com.Google.common.collect.Lists;import java.util.List;import java.util.Map;import java.util.stream.Collectors;import lombok.Data; public class Test {     private static List<User> userList = Lists.newArrayList();     @Data    public static class User {        private String userCode;        private String userName;    }         public static void initData() {        User user1 = new User();        user1.setUserCode("10001");        user1.setUserName("张三");         User user2 = new User();        user2.setUserCode("10002");        user2.setUserName("李四");         User user3 = new User();        user3.setUserCode("10002");        user3.setUserName("王五");         userList.add(user1);        userList.add(user2);        userList.add(user3);    }     public static void main(String[] args) {        initData();        //反例      //  Map<String, String> userMap = userList.stream().collect(Collectors.toMap(User::getUserCode, User::getUserName));         //正例,在后面添加(u1,u2)->u1 指定选取第一个值 当key值重复的时候,根据情况而定选取第一个还是第二个        Map<String, String> userMap = userList.stream().collect(Collectors.toMap(User::getUserCode, User::getUserName, (u1, u2) -> u1));         System.out.println(userMap);    }}

    第二种情况示例:

    import com.google.common.collect.Lists;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.stream.Collectors;import lombok.Data; public class Test {     private static List<User> userList = Lists.newArrayList();     @Data    public static class User {        private String userCode;        private String userName;    }         public static void initData() {        User user1 = new User();        user1.setUserCode("10001");        user1.setUserName("张三");         User user2 = new User();        user2.setUserCode("10002");        user2.setUserName("李四");         User user3 = new User();        user3.setUserCode("10003");        user3.setUserName(null);         userList.add(user1);        userList.add(user2);        userList.add(user3);    }     public static void main(String[] args) {        initData();        //反例       // Map<String, String> userMap = userList.stream().collect(Collectors.toMap(User::getUserCode, User::getUserName));         //正例 (如果对转换后的顺序有要求,这里还可以使用LinkedHashMap)        Map<String, String> userMap = userList.stream().collect(HashMap::new, (map, user) -> map.put(user.getUserCode(), user.getUserName()), HashMap::putAll);         System.out.println(userMap);    } }

    Stream ToMap(Collectors.toMap) 实践

    Requirements

    List TO Map

    List Stream 转换 Map时向collect()方法中传递Collector对象,对象由Collectors.toMap()方法返回。

    如下实现List转换为Map

    List<GroupBrandCateBO> list = new ArrayList<>(      Arrays.asList(              new GroupBrandCateBO("v1", "g1", "b1"),              new GroupBrandCateBO("v1", "g1", "b1"),              new GroupBrandCateBO("v3", "g3", "b3")      ));Map<String, String> map = list.stream().collect(Collectors.toMap(item -> item.getVersion(), item -> item.getGroupCode(), (oldVal, currVal) -> oldVal, LinkedHashMap::new)); System.out.println(map.getClass());Map<String, String> map0 = list.stream().collect(Collectors.toMap(item -> item.getVersion(), item -> item.getGroupCode(), (oldVal, currVal) -> oldVal));System.out.println(map0.getClass());System.out.println(map0.toString());Map<String, String> map1 = list.stream().collect(Collectors.toMap(GroupBrandCateBO::getVersion, GroupBrandCateBO::getGroupCode));System.out.println(map1.toString());

    Console
    class java.util.LinkedHashMap
    class java.util.HashMap
    {v1=g1, v3=g3}
    Exception in thread “main” java.lang.IllegalStateException: Duplicate key g1
    at java.util.stream.Collectors.lambda$throwingMerger$0(Collectors.java:133)
    &hellip;

    问题分析

    toMap()函数重载:

    • 未指定合并函数mergeFunction情况下,传入throwingMerger()返回BinaryOperator对象,当出现key重复时,调用合并函数!

    • 未指定Supplier实例情况下,默认生成HashMap实例。

    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);}public static <T, K, U, M extends Map<K, U>>Collector<T, ?, M> toMap(Function<? super T, ? extends K> keyMapper,                            Function<? super T, ? extends U> valueMapper,                            BinaryOperator<U> mergeFunction,                            Supplier<M> mapSupplier) {    BiConsumer<M, T> accumulator            = (map, element) -> map.merge(keyMapper.apply(element),                                          valueMapper.apply(element), mergeFunction);    return new CollectorImpl<>(mapSupplier, accumulator, mapMerger(mergeFunction), CH_ID);}private static <T> BinaryOperator<T> throwingMerger() {    return (u,v) -> { throw new IllegalStateException(String.fORMat("Duplicate key %s", u)); };}

    补充

    关于合并函数

    List<GroupBrandCateBO> list = new ArrayList<>(       Arrays.asList(               new GroupBrandCateBO("v1", "g1", "b1"),               new GroupBrandCateBO("v1", "g2", "b2"),               new GroupBrandCateBO("v1", "g2", "b2"),               new GroupBrandCateBO("v3", "g3", "b3")       ));Map<String, String> map00 = list.stream().collect(Collectors.toMap(item -> item.getVersion(), item -> item.getGroupCode(), (oldVal, currVal) -> currVal));Map<String, String> map01 = list.stream().collect(Collectors.toMap(item -> item.getVersion(), item -> item.getGroupCode(), (oldVal, currVal) -> oldVal + currVal));System.out.println(map00.toString());System.out.println(map01.toString());

    Console
    {v1=g2, v3=g3}
    {v1=g1g2g2, v3=g3}

    传入Lambda表达式将转化为BinaryOperator<U> mergeFunction对象,合并处理value,非Key!!!

    比如:

    (oldVal, currVal) -> currVal) // key相同时当前值替换原始值(oldVal, currVal) -> oldVal + currVal //key相同时保留原始值和当前值

    “使用stream的Collectors.toMap()方法常见问题如何解决”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

    --结束END--

    本文标题: 使用stream的Collectors.toMap()方法常见问题如何解决

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

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

    猜你喜欢
    • 使用stream的Collectors.toMap()方法常见问题如何解决
      本篇内容介绍了“使用stream的Collectors.toMap()方法常见问题如何解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!使用...
      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()方法
    • @ConfigurationProperties使用时常见问题及解决方法
      这篇文章主要介绍“@ConfigurationProperties使用时常见问题及解决方法”,在日常操作中,相信很多人在@ConfigurationProperties使用时常见问题及解决方法问题上存在疑惑,小编查阅了各式资料,整理出简单好...
      99+
      2023-06-20
    • WCF常见异常问题的解决方法
      这篇文章主要讲解了“WCF常见异常问题的解决方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“WCF常见异常问题的解决方法”吧!WCF还是比较常用的,于是我研究了一下WCF,在这里拿出来和大...
      99+
      2023-06-17
    • CSS使用中常见的问题以及解决方法
      这篇文章主要介绍“CSS使用中常见的问题以及解决方法”,在日常操作中,相信很多人在CSS使用中常见的问题以及解决方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”CSS使用中...
      99+
      2024-04-02
    • 常见问题及解决方法:Python中使用len函数的常见疑问解答
      Python中len()函数是一个常用的内置函数,用于获取对象的长度或元素的个数。在日常的Python开发中,我们经常会遇到一些关于len()函数的问题,本文将介绍一些常见问题及解决方法,并提供具体的代码示例。 TypeErro...
      99+
      2024-01-29
      解决方法 常见问题 len函数
    • Nacos的常见问题及解决方法
      本篇内容主要讲解“Nacos的常见问题及解决方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Nacos的常见问题及解决方法”吧!如何依赖最新的 Nacos 客户端?很多用户都是通过 Sprin...
      99+
      2023-06-02
    • ResponseBodyAdvice常见问题及解决方法
      这篇文章主要讲解了“ResponseBodyAdvice常见问题及解决方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“ResponseBodyAdvice常见问题及解决方法”吧!场景通过R...
      99+
      2023-06-20
    • c#使用listbox的详细方法和常见问题解决
      关于ListBox ListBox是WinForm中的列表控件,它提供了一个项目列表(一组数据项),用户可以选择一个或者多个条目,当列表项目过多时,ListBox会自动添加滚动条,使...
      99+
      2024-04-02
    • word常见问题如何解决
      这篇文章主要介绍“word常见问题如何解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“word常见问题如何解决”文章能帮助大家解决问题。word和excel有什么区别:一、作用不同 word主要用...
      99+
      2023-07-01
    • 如何使用泛型解决golang中常见问题?
      go 中泛型可解决常见痛点:类型转换:使用泛型函数简化不同类型的转换。数据结构创建:使用泛型类型简化通用数据结构的创建。函数传递:使用泛型函数声明允许传递各种类型的参数。实战案例:通过类...
      99+
      2024-05-04
      golang 泛型 编译错误 键值对
    • 使用win8遇到的常见问题介绍与解决方法
        问题1. 软件乱码多  这个问题恐怕是最令新手们头疼了,毕竟乱码不比英文,甭管你用什么翻译软件,想要弄清里面的内容几乎完全没有可能。那么遇到此类问题,我们到底该如何解决呢?  很简单,首先进入Contr...
      99+
      2022-06-04
      常见问题 解决方法
    • php使用composer常见问题及解决办法
      目录错误问题一错误问题二错误问题三错误问题四错误问题五中文镜像使用办法使用办法composer是PHP中非常优秀的一个包管理工具,可以帮助我们来管理项目所需要依赖的所有包以及插件,也...
      99+
      2024-04-02
    • SpringBoot工程下使用OpenFeign常见问题及解决方法
      这篇文章主要讲解了“SpringBoot工程下使用OpenFeign常见问题及解决方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“SpringBoot工程下使用OpenFeign常见问题及...
      99+
      2023-06-20
    • windows计划任务使用方法附常见问题解决
      计划任务应该是很老的一个系统的功能的!记得从98下就有的! 也渐渐的被人淡忘了!"----- 任务计划  然后会有一个这样的界面的: 因为是空的!所以什么都没有嘛!别着急! 双击打开 添加任务计划 (...
      99+
      2023-06-01
      计划任务 方法 使用 计划 任务 windows
    • Redis常见的几个问题及解决方法
      本篇内容主要讲解“Redis常见的几个问题及解决方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Redis常见的几个问题及解决方法”吧! 1、如何保证Redis高可用和高并发Redi...
      99+
      2023-06-16
    • MySQL事务的常见问题及解决方法
      MySQL事务的常见问题及解决方法 在数据库操作中,事务是一个非常重要的概念,可以保证一组SQL语句要么全部执行成功,要么全部失败,并且在并发操作中保证数据的一致性。然而,MySQL中...
      99+
      2024-03-01
      mysql 事务 解决 sql语句 数据丢失
    • 使用Go编写API和HTTP:如何解决常见的算法问题?
      在Web开发中,API和HTTP是必不可少的组件。Go语言在这个领域中变得越来越受欢迎,因为它具有快速、可靠和易于编写的特性。本文将介绍如何使用Go编写API和HTTP,并解决常见的算法问题。 一、API和HTTP API是应用程序编程接...
      99+
      2023-07-23
      编程算法 api http
    • mysql常见问题解决方案
      属性顺序错误 一般情况下字段类型要放在前面,限制参数放在后面,UNSIGNEDZEROFILL 之间没有先后顺序,主键 KEY 和 auto_increment 要放在UNSIGNED ZEROFILL 后面 否则报错 。设置为主...
      99+
      2018-08-06
      mysql常见问题解决方案
    • C++中常见的异常处理问题解决方法
      C++中常见的异常处理问题解决方法,需要具体代码示例引言:在编写C++程序时,时常会遇到程序出现异常的情况,如除数为0、数组越界、空指针访问等等。这些异常会导致程序的崩溃或者产生不可预测的结果,为了增强程序的稳定性和可靠性,我们需要使用异常...
      99+
      2023-10-22
      解决方法 异常处理 C++异常
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作