当前位置: 首页 > news >正文

javaStream流toMap小坑

先来show一下报错信息:
java.lang.IllegalStateException: Duplicate key 13800138000 (attempted merging values BlackTelChannel(id=null, tel=13800138000, source=A, industry=null, createdAt=null, available=null) and BlackTelChannel(id=null, tel=13800138000, source=C, industry=null, createdAt=null, available=null))
刚开始还以为是数据库数据有唯一索引。后面才发现是lambda-stream流tomap搞得鬼。分析:
Collectors.toMap有3个方法,

方法1:2个参数,

toMap(Function<? super T, ? extends K> keyMapper,Function<? super T, ? extends U> valueMapper) 

方法2: 3个参数,

toMap(Function<? super T, ? extends K> keyMapper,Function<? super T, ? extends U> valueMapper,BinaryOperator<U> mergeFunction) 

方法3: 4个参数

toMap(Function<? super T, ? extends K> keyMapper,Function<? super T, ? extends U> valueMapper,BinaryOperator<U> mergeFunction,Supplier<M> mapFactory)

[当你希望使用特定类型的 Map(比如 LinkedHashMap、ConcurrentHashMap 等),而不是默认的 HashMap,就可以通过这个参数指定:() -> new LinkedHashMap<>()]

我是使用了3个参数就解决了问题,代码如下:

package com.funmz.vos2gaid2black;import lombok.Builder;
import lombok.Data;
import org.junit.jupiter.api.Test;import java.io.Serial;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;public class ScheduleTaskTest {@Data@Builderpublic static class BlackTelChannel implements Serializable {@Serialprivate static final long serialVersionUID = -8297608645555174167L;private String tel;private String source;}@Testpublic void testDuplicateTelToMap() {// 准备测试数据List<BlackTelChannel> oldList = new ArrayList<>();oldList.add(BlackTelChannel.builder().tel("13800138000").source("A").build());oldList.add(BlackTelChannel.builder().tel("13800138000").source("C").build()); // 与第一条 tel 重复oldList.add(BlackTelChannel.builder().tel("13900000000").source("B").build());oldList.add(BlackTelChannel.builder().tel("13700000000").source("D").build());System.out.println("oldList:" + oldList);System.out.println("oldList:" + oldList.size());// 执行转换逻辑Map<String, BlackTelChannel> oldBlackMap = oldList.stream().collect(Collectors.toMap(BlackTelChannel::getTel,Function.identity(), (existing, replacement) -> existing // existing 保留第一个遇到的 key ,replacement:最后一个));System.out.println("oldBlackMap = " + oldBlackMap);System.out.println("oldBlackMap = " + oldBlackMap.size());}
}

相关文章:

  • 算法与数据结构 - 常用图算法总结
  • 视频编解码学习六之视频采集和存储
  • C++算法(19):整数类型极值,从INT_MIN原理到跨平台开发实战
  • 大模型备案材料解析:模型服务协议涵盖内容
  • SpringBoot+Dubbo+Zookeeper实现分布式系统步骤
  • 【hadoop】Sqoop数据迁移工具的安装部署
  • 车载网络TOP20核心概念科普
  • 如何使用极狐GitLab 软件包仓库功能托管 ruby?
  • 3.2.3 掌握RDD转换算子 - 2. 过滤算子 - filter()
  • 按摩椅的机芯类型和材质
  • vue中router和route的区别
  • 矿井设备通信破局:ModbusTCP转DeviceNet网关应用实践
  • 2025年3月青少年机器人技术等级考试(二级)实际操作真题试卷
  • 从单智到多智:深度拆解基于MetaGPT的智能体辩论
  • Kafka消息不丢失处理
  • leetcode 3342. 到达最后一个房间的最少时间 II 中等
  • IC ATE集成电路测试学习——PLL测试(一)
  • 2025年前端在线协同编辑技术研究
  • 使用Compose编排工具搭建Ghost博客系统
  • 《易语言学习大全》
  • 代理销售保险存在误导行为,农业银行重庆市分行相关负责人被罚款0.1万元
  • 海关总署统计分析司司长:4月进出口增速较一季度加快4.3个百分点
  • 洛杉矶奥组委确认2028年奥运会和残奥会开闭幕式场地
  • 上海推动AI+文旅深度融合,MaaS平台和产业基地落地徐汇
  • 中信银行:拟出资100亿元全资设立信银金融资产投资有限公司
  • 云南临沧一行贿案金额认定比受贿案多41万,重审时检方变更金额起诉