位置: IT常识 - 正文

Java8 Stream流Collectors.toMap当key重复时报异常(IllegalStateException)

发布时间:2024-01-07
Java8 Stream流Collectors.toMap当key重复时报异常(IllegalStateException) 一、问题

推荐整理分享Java8 Stream流Collectors.toMap当key重复时报异常(IllegalStateException),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:,内容如对您有帮助,希望把文章链接给更多的朋友!

在使用Collectors.toMap(Function<? super T, ? extends K> keyMapper, Function<? super T, ? extends U> valueMapper)(两个参数的)时,如果 key 有重复,则会报异常(IllegalStateException)。

 

二、分析

Collectors.toMap()是有三个重载方法(2个参数,3个参数,4个参数),如下所示:

keyMapper:Key 的映射函数

valueMapper:Value 的映射函数

mergeFunction:当 Key 冲突时,调用的合并方法

mapSupplier:Map 构造器,在需要返回特定的 Map 时使用

1、toMap(Function<? super T, ? extends K> keyMapper, Function<? super T, ? extends U> valueMapper);2、toMap(Function<? super T, ? extends K> keyMapper, Function<? super T, ? extends U> valueMapper, BinaryOperator<U> mergeFunction);3、toMap(Function<? super T, ? extends K> keyMapper, Function<? super T, ? extends U> valueMapper, BinaryOperator<U> mergeFunction, Supplier<M> mapSupplier);

①第一个,如果key冲突了,会默认抛出异常

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);}Java8 Stream流Collectors.toMap当key重复时报异常(IllegalStateException)

②第二个,如果key冲突了,可以按照指定的要求进行合并(取第一个还是最后一个)

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 类型

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);}

举例如下:

三、解决方法

避免出现重复时报异常,建议选用第二个带3个参数的 toMap 方法(一般取前面value的值,或者取后面放入的 value 值则覆盖先前的 value 值)。

1、选用重复 key 中第一个 value 值

Map<String, Object> result = list.stream().flatMap(m -> m.entrySet().stream()) .collect(Collectors.toMap(m -> m.getKey(), m -> m.getValue(), (v1, v2) -> v1));

2、选用重复 key 中最后一个 value 值 (若重复 key 元素有2个则取第二元素的 value,若有3个则取第三个的 value,…)

Map<String, Object> result = list.stream().flatMap(m -> m.entrySet().stream()) .collect(Collectors.toMap(m -> m.getKey(), m -> m.getValue(), (v1, v2) -> v2));

3、指定取哪个value值或哪种类型的value值(具体的实践根据具体的业务来操作数据即可)

4、直接返回一个给定的默认值

四、注意事项

1、key 不能有重复,如果重复则需要使用合并函数取默认值,否则会报错,因为 Map 的 key 不能重复。 2、合并函数有两个参数,第一个参数是重复数据中的第一个元素,第二个参数是重复数据中的最后一个元素,可以用来返回默认值。 3、使用合并函数可以配合排序函数,根据排序规则正序、倒序,取每组重复数据中最近或最远的一条数据,用来处理适当的业务。(上面没有举例,自行验证)

本文链接地址:https://www.jiuchutong.com/zhishi/289049.html 转载请保留说明!

上一篇:【猿人学WEB题目专解】猿人学第6题(猿人知乎)

下一篇:html怎么引入JavaScript代码(html怎么引入图片)

  • 微信支付帐单明细怎么查(微信支付帐单明细删除后还能查询吗)

    微信支付帐单明细怎么查(微信支付帐单明细删除后还能查询吗)

  • 华为手机怎么打开小艺(华为手机怎么打开空调开关)

    华为手机怎么打开小艺(华为手机怎么打开空调开关)

  • wps表格打印预览快捷键(wps表格打印预览显示不全怎么设置)

    wps表格打印预览快捷键(wps表格打印预览显示不全怎么设置)

  • qq字符为什么显示不出来(qq显示字符)

    qq字符为什么显示不出来(qq显示字符)

  • 天猫精灵有啥用(天猫精灵有啥用途多少钱)

    天猫精灵有啥用(天猫精灵有啥用途多少钱)

  • 抖音直播可以放电影吗(抖音直播可以放电视剧吗)

    抖音直播可以放电影吗(抖音直播可以放电视剧吗)

  • rmx1991是什么手机(rmx1971是什么型号)

    rmx1991是什么手机(rmx1971是什么型号)

  • 畅连视频是什么(畅连视频是什么功能)

    畅连视频是什么(畅连视频是什么功能)

  • 抖音注销了别人还能看见作品吗(抖音注销了别人看到是什么样子)

    抖音注销了别人还能看见作品吗(抖音注销了别人看到是什么样子)

  • 1650ti比1650强多少(1650ti和1650性能差距多大)

    1650ti比1650强多少(1650ti和1650性能差距多大)

  • 手机上的nnbs能删吗(手机ncn)

    手机上的nnbs能删吗(手机ncn)

  • ipadair是什么型号(ipad air是啥)

    ipadair是什么型号(ipad air是啥)

  • 快手快币怎么转送好友(快手快币怎么转到其他快手号里)

    快手快币怎么转送好友(快手快币怎么转到其他快手号里)

  • 华为p30本身就有手机膜吗(华为p30有没有什么特殊的功能)

    华为p30本身就有手机膜吗(华为p30有没有什么特殊的功能)

  • windows7常用附件有哪些(win7常用的附件)

    windows7常用附件有哪些(win7常用的附件)

  • 华为怎样卸载手机桌面上的软件(华为怎样卸载手机自带软件)

    华为怎样卸载手机桌面上的软件(华为怎样卸载手机自带软件)

  • 手机号与银行预留手机号不一致(手机号与银行预留手机号不一致怎么回事建行)

    手机号与银行预留手机号不一致(手机号与银行预留手机号不一致怎么回事建行)

  • OPPO k5有红包提醒功能吗(opporeno5红包提醒)

    OPPO k5有红包提醒功能吗(opporeno5红包提醒)

  • 安卓隔空投送在哪里(安卓隔空投送app)

    安卓隔空投送在哪里(安卓隔空投送app)

  • 手机号怎么查抖音(手机号怎么查抖音用户名)

    手机号怎么查抖音(手机号怎么查抖音用户名)

  • 电池医生怎么检测电池(电池健康怎么检查)

    电池医生怎么检测电池(电池健康怎么检查)

  • qq被好友屏蔽了还可以看对方的空间吗(qq被好友屏蔽了还能发出去消息吗)

    qq被好友屏蔽了还可以看对方的空间吗(qq被好友屏蔽了还能发出去消息吗)

  • 小爱同学可以语音唤醒吗(小爱同学可以语音留言吗)

    小爱同学可以语音唤醒吗(小爱同学可以语音留言吗)

  • 索引的原理(mysql索引的原理)

    索引的原理(mysql索引的原理)

  • 中国有5g手机吗(中国哪有5g)

    中国有5g手机吗(中国哪有5g)

  • windows无法连接到wifi解决方法(windows无法连接到打印机指定的网络名不再可用)

    windows无法连接到wifi解决方法(windows无法连接到打印机指定的网络名不再可用)

  • 税收减免属于什么收入
  • 电子税务局增值税发票系统
  • 营业收入净额是营业总收入吗
  • 税费返还计入什么费用
  • 未达起征点销售额和小微企业免税销售额
  • 个体工商户核定征收税率
  • 怎么知道购货方电话号码
  • 存货核算与销售核算直接联系的是
  • 工会经费免征三年需要申报吗
  • 银行承兑汇票背书可以拆分
  • 对公账户的钱能转到私人账户吗
  • 军队票据可作税前扣除凭证吗
  • 辅导期一般纳税人管理办法
  • 建筑业企业分包出克的是否能上报
  • 采购入库损耗如何计算
  • 印花税的计税依据怎么算公式
  • 固定资产原值增加后如何计提折旧
  • 增值税免税收入进项税额转出
  • 个税贷方余额比实际金额多
  • 增值税专用发票和普通发票的区别
  • 物业公司的跨期收费如何确认收入?
  • 母公司开票给子公司有什么税务风险吗
  • 财务部门固定资产修理费计入什么科目
  • 收到代收款怎么做分录
  • 新成立的有限公司
  • 参加失业保险本期实际缴费金额包括员工承担部分吗?
  • 香港企业股东分红税
  • 联想thinkpad安装win7方法
  • win10锁屏界面windows聚焦什么意思
  • 静态回收期计算方法例子
  • rtx3090 rtx titan
  • 网吧登录qq安全吗
  • 红蘑菇是什么松树伞吗
  • phpadmin官网
  • win10预览版是什么意思
  • 耕地占用税的具体内容
  • 按揭贷款到账时间
  • 如何申请办理港澳通行证
  • uniapp使用px还是rpx
  • 旅游企业税务筹划
  • 前端框架学哪个好
  • 什么是Unicode
  • Pytorch深度学习实战3-6:详解网络骨架模块nn.Module(附实例)
  • php内存缓存功能怎么用
  • Linux下DedeCMS/织梦CMS安全设置教程
  • 资产负债表有投资成本吗
  • seata1.3.0配置
  • 企业捐款给公益组织
  • sql2008还原
  • 计提存货跌价准备计算公式
  • 暂估入账跨年如何红冲
  • 研发支出放在报表哪里
  • 产品质量监督检查的重点是
  • 融资租入固定资产的账务处理
  • 外贸出口退税政策
  • 预付账款的账务处理视频教程
  • 当月增加的固定资产当月不计提折旧
  • 丢失的发票怎么查询
  • 房地产开发企业销售自行开发的房地产项目
  • 直租业务可以抵房租吗
  • 怎样从sql数据库取数据
  • macbook和windows
  • FastDFS4和Ubuntu12安装及部署步骤
  • centos inode
  • win7系统开启无线服务
  • win8系统如何关闭防火墙
  • pm是什么软件的缩写
  • win7电脑出现广告弹窗怎么办
  • vue eventhub
  • 批处理设置dns
  • cmd批处理命令文件个数
  • exe取消隐藏属性
  • threejs 源码
  • unity导入设置在哪里
  • unity3d基于物理系统的2D平台跳跃游戏
  • jquery获取点击元素的id
  • js动态调用方法
  • 北京电子税务
  • 税务局收垃圾处置费
  • 关于船舶吨税的最新法律规范
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号