Java8中通过Stream使用Collectors.toMap及踩坑记录

别再被Collectors.toMap坑了!Java 8 Stream处理重复Key的3种实战方案(附源码对比) 本文深入探讨了Java 8 Stream中Collectors.toMap方法处理重复Key的3种实战方案,包括合并函数、分组收集和数据预过滤。通过源码对比和性能测试,帮助开发者避免常见的IllegalStateException错误,提升代码健壮性。文章还提供了业务场景选型建议和架构层面的预防措施,是Java开发者必备的实用指南。 阅读详情

1. 说明

        Java8中添加Stream流操作,可以简化部分操作,使得代码更为简洁。本文主要记录部分使用方法及踩坑记录

2. 简单示例

        如果需要将一个List<User>转为Map<String, String>,key为对象的userId, value为userName。

2.1 非Stream实现

在Java7中通常可以使用以下代码实现:

@Test
public void test01() {
        List<User> list = new ArrayList<>();
        list.add(new User("1", null, null));
        list.add(new User("2", "zhang", "wu"));
        list.add(new User("1", "qiqi", "wu"));
        HashMap<String, String> map = new HashMap<>();
        for (User user : list) {
            map.put(user.getUserId(), user.getUserName());
        }
        System.out.println(map);
}

2.2 Stream实现

@Test
public void test02() {
        List<User> list = new ArrayList<>();
        list.add(new User("2", "zhang", "wu"));
        list.add(new User("1", "qiqi", "wu"));
        Map<String, String> collect = list.stream().collect(Collectors.toMap(User::getUserId, User::getUserName));
        System.out.println(collect);
}

2.3 踩坑点

        但是如果按照2.2中在项目中去实现是远远不够的,实际使用中会出现很多bug。例如更换下输入数据便会报错。

List<User> list = new ArrayList<>();
list.add(new User("1", null, null));
list.add(new User("2", "zhang", "wu"));
list.add(new User("1", "qiqi", "wu"));

报错场景及原因

  • 需要自定义key重复处理策略,不然key重复会报错java.lang.IllegalStateException: Duplicate key xxx
  • value为null,会报空指针异常java.lang.NullPointerException

解决方案

  • 自定义重复策略, 例如:(s1, s2) -> s1
  • 处理value为空问题,例如: u.getUserName() == null ? "" : u.getUserName()
@Test
public void test03() {
        List<User> list = new ArrayList<>();
        list.add(new User("1", null, null));
        list.add(new User("2", "zhang", "wu"));
        list.add(new User("1", "qiqi", "wu"));
        Map<String, String> collect = list.stream().collect(Collectors.toMap(User::getUserId, u ->
                        u.getUserName() == null ? "" : u.getUserName()
                , (s1, s2) -> s1));
        System.out.println(collect);
}

Java中Collectors.toMap()的基本使用方法和使用场景 1、Collectors.toMap()是Java8引入的流特性,可以把集合转换为Map集合,转换对象中的key不可重复,重复会报错。4、List转Map,id作为key,name作为value,如果Id重复取最后一个name。2、List转Map,id作为key,name作为value,如果Id重复取第一个name。3、List转Map,id作为key,元素对象作为value,如果Id重复取第一个元素。2、List转Map,id作为key,name作为value,id不可重复。 阅读详情

相关推荐

离散系统傅里叶变换的常用结论证明

本文介绍了离散系统傅里叶变换的三个重要结论:1)时域卷积对应频域相乘(公式1-3);2)时域相乘对应频域卷积(公式4-6);3)帕塞瓦尔定理(公式7)及其广义形式,证明信号能量在变换域保持不变。文末提供了MATLAB卷积运算演示程序,通过动画展示离散信号卷积过程(翻转、平移、相乘、累加),并以方波信号为例给出运行结果图。该程序直观呈现了卷积运算的步骤与结果。

newtton的博客 1304

深入解析Java Stream中Collectors.toMap的实战技巧

本文深入解析Java Stream中Collectors.toMap的实战技巧,涵盖键值提取、键冲突处理、自定义Map实现等核心用法。通过实际代码示例,展示如何高效处理数据转换、避免常见陷阱,并优化性能,适用于电商、日志分析等复杂业务场景。

weixin_28740299的博客 332

大疆控制算法笔试复习指南:从PID到MPC核心考点解析

控制算法是无人机、机器人等智能装备实现自主运行的核心技术。从经典控制到现代控制,PID控制算法、LQR控制算法、预测控制算法(MPC)以及Stanley控制算法等,构成了工程实践中不可或缺的方法体系。理解其数学原理、适用条件与调参逻辑,是评估系统稳定性、动态响应与抗扰能力的基础。在无人机飞控、云台增稳、车载路径跟踪等典型场景中,这些算法直接决定了设备的实际性能表现。大疆等企业相关岗位的笔试,正是围绕上述核心知识点,考查候选人对控制系统本质的理解、数学推导能力以及工程实现素养。本文整理了一套覆盖理论基石、高频

weixin_33178839的博客 359

【Java基础】Stream 流中 Collectors.toMap 的用法

Collectors.toMap() 方法是把List 转 Map的操作。

yuxiangdeming的博客 1万+

《全连接到卷积神经网络:图像识别的演变历程》

这篇文章会从传统全连接层面临的困境说起,揭示卷积神经网络(CNN)成为图像识别核心动力的原因,探究其背后蕴含的设计思想与技术创新。但是回顾历史,CNN的出现提醒我们:技术的突破往往是由对自然规律的模仿和重新构建得来的。也许,当机器真的学会“像人一样看世界”的时候,它们的“眼睛”早就超过生物视觉的限制了。例如,用5×5的核处理224×224的输入时,只要25个参数(而不是全连接那种百万级的)。* 局部性:网络的底层只需留意局部的地方(像边缘、纹理这样的地方),不用管那些全局像素之间复杂的关系。

2401_82434295的博客 674

从SIGGRAPH审稿人视角看:什么样的TOG论文更容易被接收?

本文从SIGGRAPH审稿人视角深入解析TOG论文的审稿标准与投稿策略,揭示如何提升论文接收概率。重点探讨创新性、技术深度、实验验证等核心评分维度,并提供写作技巧与审稿意见应对策略,帮助研究者优化ACM Transactions on Graphics投稿质量。

weixin_33721344的博客 108

java8的stream中的toMap

我们将对这个List使用java8的strea中的toMap转换成Map对象。 toMap有个三个重载的方法,toConcurrentMap同理: 两个参数 public static <T, K, U> Collector<T, ?, Map<K,U>> toMap(Function<? super T, ? extends K> keyMapper, Functio..

qq_41434612的博客 1万+

CXL技术入门:从PCIe到高性能计算的桥梁(附最新2.0协议解析)

本文深入解析CXL技术如何作为PCIe的进化版,成为高性能计算的关键桥梁,特别聚焦CXL 2.0协议的关键升级。从技术架构、三大子协议到典型应用场景,全面介绍CXL在缓存一致性、内存共享等方面的优势,帮助开发者快速掌握这一前沿技术。

wdx012345的博客 728

Stream流之Collectors.toMap()方法详解

可以看到,这个方法可以有四个参数,前两个是必须的,我们可以清楚的理解前两个,一个是key,一个是value,最后一个其实是一个当 Key 冲突时调用的合并方法,最后一个是Map 构造器在需要返回特定的 Map 时使用,最后一个几乎很少使用。假设现在需求是返回一个list集合,那该怎么做呢,这个比较复杂,直接贴出代码。假设现在需求是返回老师底下的所有同学的最高分或者总分之类的应该怎么实现,一个简单的业务就是查询老师的时候把这个老师底下的学生也顺带查出来。其实如果需求是这样的话有个更简单的方法,

m0_65408235的博客 7495

【算法】—前缀和与差分详解

前缀和指一个数组的某下标之前的所有数组元素的和(即数列的前n项求和),前缀和是一种重要的预处理,能够降低算法的时间复杂度,可以快速地求出某一段的和,对于处理区间之间的问题是往往十分高效相比较其他算法而言,前缀和更像是一种解题的技巧,一种优化方式输入一个长度为 n 的整数序列。接下来再输入 m 个询问,每个询问输入一对 l,r 对于每个询问,输出原序列中从第 l 个数到第 r 个数的和5 32 1 3 6 41 21 32 4123453610。

DAY I 的成长之路 6023

UNet改进(23):如何用SLCAM模块提升UNet的分割性能

本文提出一种改进的UNet架构,通过引入轻量化注意力模块(SLCAM)增强医学图像分割性能。SLCAM整合了通道和空间双重注意力机制:通道注意力采用全局池化和共享MLP学习通道权重,空间注意力通过7×7卷积捕捉上下文信息。网络在传统UNet基础上,在每个下采样和上采样块后加入SLCAM模块,并保持跳跃连接结构。实验表明,该方法能自适应聚焦重要特征,在不显著增加计算负担的情况下提升分割精度,特别适用于医学图像等需精确边界的场景。未来可探索三维注意力、动态参数调整等改进方向。

2501_91516851的博客 439

Java8之Stream流的Collectors.toMap避坑指南

玩转Stream流之toMap避坑指南

weixin_49190101的博客 7787

华为OD机试 - 字符串筛选排序 - 数组(Python/JS/C/C++ 双机位C卷 100分)

k如果大于字符串长度则输出最大ASCII码值的字母所在字符串的位置索引,如果第k个最小ASCII码值的字母存在重复 则输出该字母的最小位置索引。输入一个由N个大小写字母组成的字符串,按照ASCII码值从小到大进行排序,查找字符串中第K个最小ASCII码值的字母(k>=1)。k如果大于字符串长度则输出最大ASCII码值的字母所在字符串的位置索引,如果有重复字母则输出字母的最小位置索引。输出字符串中第k个最小ASCII码值的字母所在字符串的位置索引。第二行输入k ,k必须大于0 ,k可以大于输入字符串的长度。

学Java,找哪吒 1392

Java 8 :List 转 Map 之 Collectors.toMap()

【前言】 在很多编码时候,我们需要将我们的 List 对象集合,转成为简单的 Map 集合,从而方便很多后续操作。 比如:我们现在有一个用户类 User 如下: public class User { // 用户ID private long id; // 用户名称 private String name; // 相关constrator,getter,setter,toString()方法已省略 } 那么,我们可以简单的初始化得到一个 List<User> 的数

小白一个 6万+

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

java8 stream使用笔记、静态方法引用、collectors

java8 stream使用笔记

enthan809882的博客 1万+

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

java8 Stream API中Collectors中toMap方法的问题以及解决

解决异常:java.lang.IllegalStateException: Duplicate key **   最近在项目中使用java8的list 转 map的时候遇到了重复值的异常: Exception in thread "main" java.lang.IllegalStateException: Duplicate key Person@568db2f2 at java....

iteye_9573的博客 2910

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

使用Collectors.toMap()报NullPointerException

分析Collectors.toMap(Pair::getKey, Pair::getValue, (v1, v2) -> v1)按照我们正常思维逻辑这不应该会出现这个问题,想当然理解成。这边可以看出key,value都可以为空。不能为空,再看下我们使用的。记录下最近工作中在使用。

youxiaxiaomage的博客 3027

Java小白也能懂的Collectors.toMap指南

对于更复杂的例子,比如要把整个学生对象作为值,或者需要多层嵌套的Map结构,平台也能很好地支持。作为一个刚接触Java集合操作的新手,我发现这个方法在处理数据转换时特别方便,尤其是需要把列表转换成键值对映射的场景。想象一下,你有一份班级学生名单(List),现在需要把它转换成通讯录(Map),其中学号作为键,学生姓名作为值。[Student(101,"张三"), Student(102,"李四"), Student(103,"王五")]如果遇到学号重复的情况,可以选择保留先出现的记录。102: "李四",

OnyxPanther23的博客 903

Java 8 流式处理:深入解析 Stream API、Collectors.toMap、方法引用与 Lambda 表达式!!!

Java 8 引入了 Stream API、Collectors.toMap、方法引用和 Lambda 表达式等特性,极大提升了代码的简洁性和表达力。本文通过一个代码片段,深入解析了这些技术的应用。Stream API 提供了声明式处理集合的方式,Collectors.toMap 用于将流元素收集为 Map,方法引用简化了 Lambda 表达式的语法,而 Lambda 表达式则支持函数式编程。

小丁的博客 1157

【Java 8 新特性】Collectors.toMap() 实战:从基础用法到高级场景与性能考量

本文深入探讨Java 8中Collectors.toMap()的实战应用,从基础用法到高级场景与性能考量。通过示例代码展示如何将List快速转换为Map,处理键冲突、定制Map实现及优化大数据量处理。特别适合需要高效集合操作的Java开发者,提升代码质量与性能。

weixin_34034670的博客 323

Java8中stream()操作toMap()时Duplicate key问题解决

问题描述: 最近使用Java8中Steam()流进行tomap转换编程时,遇到以下错误 java.lang.IllegalStateException: Duplicate key bbb at java.util.stream.Collectors.lambda$throwingMerger$0(Collectors.java:133) at java.util.HashMap.merge(HashMap.java:1253) at java.util.stream.Collectors.lambd

bug的博客 2万+

从HashMap到LinkedHashMap:Java Stream Collectors.toMap自定义Map类型的完整指南

本文深入解析Java Stream API中Collectors.toMap方法,重点介绍如何通过mapSupplier参数自定义Map类型,特别是HashMap与LinkedHashMap的选择。通过实际代码示例和性能对比,帮助开发者在需要保持元素顺序或特定排序的场景中做出最优决策,提升流处理效率。

weixin_30897233的博客 518

Collectors.toMap使用记录

我有一个enum枚举类,其中含有3个枚举常量。我现在需要将这三个枚举常量统一转化为Map结构的数据。key是enum的code,value就是enum本身。最近看到一行比较有趣的代码,他的功能就是将List转换为Map。我觉得挺有意思的,先前没遇到过,于是打算写篇文章记录一下。我们逐步介绍一下这行代码的功能。下方代码可以一行实现这个功能。

qq_62835094的博客 564

java Stream的Collectors.toMap 用法

直接上代码: importjava.util.ArrayList; importjava.util.List; importjava.util.Map; importjava.util.stream.Collectors; publicclasstest4{ publicstaticvoidmain(String[]args){ //TODOAuto-generatedmethodstub List<UserBo&g...

IT匠人的博客 4266
上一篇: Druid连接池工具公式化SQL附踩坑记录
下一篇: Spring中动态注册和销毁对象(二)
pp_lan
博客等级 码龄10年 419粉丝 130原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值