位置: IT常识 - 正文

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

编辑:rootadmin
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怎么引入图片)

  • 苹果12pro max电池百分比怎么设置(苹果12promax电池容量有多大)

    苹果12pro max电池百分比怎么设置(苹果12promax电池容量有多大)

  • 抖音怎么关闭被拉进群(抖音怎么关闭被拉别的直播间)

    抖音怎么关闭被拉进群(抖音怎么关闭被拉别的直播间)

  • qq音乐设置铃声怎么给卡二设置(qq音乐设置铃声为什么默认在卡1里)

    qq音乐设置铃声怎么给卡二设置(qq音乐设置铃声为什么默认在卡1里)

  • 一个邮箱可以注册几个steam账号(一个邮箱可以注册几个steam)

    一个邮箱可以注册几个steam账号(一个邮箱可以注册几个steam)

  • 华为手机背后的标签能撕掉吗(华为手机背后的标志是什么)

    华为手机背后的标签能撕掉吗(华为手机背后的标志是什么)

  • 荣耀30有前置自动对焦吗(荣耀30有前置自拍吗)

    荣耀30有前置自动对焦吗(荣耀30有前置自拍吗)

  • 电脑怎么清理灰尘(电脑怎么清理灰尘方法)

    电脑怎么清理灰尘(电脑怎么清理灰尘方法)

  • 小米网络位置服务耗电(小米网络位置服务是什么意思)

    小米网络位置服务耗电(小米网络位置服务是什么意思)

  • vivobf3电池是什么手机(vivo b-f3电池是什么型号)

    vivobf3电池是什么手机(vivo b-f3电池是什么型号)

  • 苹果xs max小白点怎么调出来(苹果xs max小白点打开了点没有反应)

    苹果xs max小白点怎么调出来(苹果xs max小白点打开了点没有反应)

  • 苹果手机怎么分辨冷暖屏(苹果手机怎么分享网络)

    苹果手机怎么分辨冷暖屏(苹果手机怎么分享网络)

  • ETC蓝牙拒绝配对怎么办(etc蓝牙拒绝配对小米手机)

    ETC蓝牙拒绝配对怎么办(etc蓝牙拒绝配对小米手机)

  • 苹果11锁屏声音有时大有时小(苹果11锁屏声音忽大忽小)

    苹果11锁屏声音有时大有时小(苹果11锁屏声音忽大忽小)

  • qq一个太阳多少星星(qq一个太阳多少天)

    qq一个太阳多少星星(qq一个太阳多少天)

  • mate8多大屏幕尺寸(华为mate8多大的屏)

    mate8多大屏幕尺寸(华为mate8多大的屏)

  •  win7是一种什么系统(win7是一种什么操作系统)

    win7是一种什么系统(win7是一种什么操作系统)

  • soul举报是匿名的么(soul举报人会怎样)

    soul举报是匿名的么(soul举报人会怎样)

  • 华为sea-al00是什么型号(华为sea-al00是什么型号多少钱专卖店)

    华为sea-al00是什么型号(华为sea-al00是什么型号多少钱专卖店)

  • 华为mate30是双系统吗(华为mate30双系统怎么关闭)

    华为mate30是双系统吗(华为mate30双系统怎么关闭)

  • ipad键盘怎么用(iPad键盘怎么用)

    ipad键盘怎么用(iPad键盘怎么用)

  • vue字幕的字体怎么变大小(vue添加字幕怎么没显示)

    vue字幕的字体怎么变大小(vue添加字幕怎么没显示)

  • word尾注怎么设置(word尾注怎么设置在特定页)

    word尾注怎么设置(word尾注怎么设置在特定页)

  • 显卡插槽插哪个都一样吗(显卡插槽插哪个性能好)

    显卡插槽插哪个都一样吗(显卡插槽插哪个性能好)

  • 苹果怎么设置不更新系统(苹果怎么设置不自动更新软件app)

    苹果怎么设置不更新系统(苹果怎么设置不自动更新软件app)

  • 小米手环3黑屏怎么处理(小米手环3黑屏无法唤醒)

    小米手环3黑屏怎么处理(小米手环3黑屏无法唤醒)

  • 华为p30备忘录怎么提醒(华为P30备忘录怎么没有了)

    华为p30备忘录怎么提醒(华为P30备忘录怎么没有了)

  • vivox6s电池容量多大(vivox6s手机电池容量)

    vivox6s电池容量多大(vivox6s手机电池容量)

  • 怎么设置手机停机(怎么设置手机停机铃声)

    怎么设置手机停机(怎么设置手机停机铃声)

  • 若依(RuoYi )权限管理设计(若依和pig)

    若依(RuoYi )权限管理设计(若依和pig)

  • 【Vue】Cannot set reactive property on undefined,null,or primitive value:undefined(vue cannot set property)

    【Vue】Cannot set reactive property on undefined,null,or primitive value:undefined(vue cannot set property)

  • 工程设备一览表
  • 计算增值税时要包括关税吗
  • 商铺税费怎么算2021
  • 企业所得税的营业成本
  • 季中转一般纳税人申报步骤
  • 小规模纳税人专票税率是多少
  • 资产负债表中的货币资金怎么算
  • 用于不动产的进项税能抵扣吗
  • 公司聘请专家的差旅费可以税前扣除吗
  • 装修费可以一次性计入费用吗
  • 专家评审费如何报销费用
  • 核定征收的个人所得税怎么申报
  • 建筑业2019年最新税率表
  • 公司租车费用会计分录
  • 免租要怎么交税
  • 关联交易的解释
  • 税务登记证遗失补办
  • 本月只有红字发票该怎么申报小规模
  • 房产企业竞标取消通知
  • 金税盘减免税款贷方余额
  • 进项发票没有收到,销项已开出,成本如何结转
  • 购买原材料无法确认收入
  • 企业发生的亏损不一定会导致所有者权益减少
  • windows11怎么快速截屏
  • 社保是当月计提当月的吗
  • 金税三期怎么更正申报
  • linux相关命令及用法
  • php 静态
  • win11怎么双击直接打开程序
  • 蚊子咬了怎么消肿止痒最快红霉素软膏
  • 税收滞纳金可以抵税吗
  • 秋分日的时间意义庆祝方式
  • uni-app 怎么实现页面不跳转依旧可以传数据
  • 权益的定义特征
  • 代订机票发票可以入账吗
  • python基本功
  • php使用pdo连接数据库
  • yolo改进方法
  • google map
  • 基于深度学习的图像超分辨率——综述
  • 蓝桥杯官网报名2020
  • 前后端分离项目部署到服务器
  • windows where命令
  • 建筑工程拨款流程
  • 微信小程序实现支付功能
  • 增值税小规模纳税人适用3%征收率
  • 小规模纳税人差额征收税率是多少
  • 工程公司的材料员考试难吗
  • 入伙和退伙的法律效力
  • 一般纳税人直接不管会怎么样
  • 摊销期在一年以内房租的账务处理
  • 公户里的钱可以随便转出嘛
  • 用友t3采购订单怎么录入
  • 应收账款的明细科目一般按照什么设置
  • 借方记录什么的增加
  • 财政收据使用范围
  • 生产经营收入总额填什么金额
  • 单位组织活动主持词
  • 企业年报修改后没有公示怎么办
  • 弥补上年亏损所需的资金
  • win8系统如何开机直接进入桌面
  • windowsp.exe - windowsp是什么进程
  • 怎么开aero透明模式
  • win7旗舰版更改适配器没有蓝牙连接
  • centos7打开命令行
  • win7系统打不开浏览器
  • linuxzen
  • android app开发中五种常用布局的运用场合
  • node.js怎么搭建服务器
  • python怎么计数
  • node-red 全局变量
  • 很好的资源学习入口_android
  • nodejs如何运行html
  • 批处理清空文本内容
  • shell脚本实现文件移动、复制等操作
  • js实现瀑布流效果
  • 控件begininvoke
  • 税控盘解除风险
  • 发票开票人一定要真实姓名吗
  • 税务机关绩效管理十年变化
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设