位置: 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怎么引入图片)

  • 微信收付款二维码怎么设置密码(微信收付款二维码截图可以用吗)

    微信收付款二维码怎么设置密码(微信收付款二维码截图可以用吗)

  • 华为手机怎么关闭喝水提醒(华为手机怎么关闭广告)

    华为手机怎么关闭喝水提醒(华为手机怎么关闭广告)

  • 苹果13怎么把5g换成4g(苹果13怎么把5g网络改成4g网络)

    苹果13怎么把5g换成4g(苹果13怎么把5g网络改成4g网络)

  • 微信怎么查社保卡余额明细(微信怎么查社保有没有交)

    微信怎么查社保卡余额明细(微信怎么查社保有没有交)

  • 魅族 18 Pro支持的视频频格式有哪些(魅族18pro支持多少倍变焦)

    魅族 18 Pro支持的视频频格式有哪些(魅族18pro支持多少倍变焦)

  • 抖音直播不清晰可以调整吗(抖音直播不清晰是什么原因?)

    抖音直播不清晰可以调整吗(抖音直播不清晰是什么原因?)

  • 华为p30电池耐用吗(华为p30手机换电池多少钱)

    华为p30电池耐用吗(华为p30手机换电池多少钱)

  • hp136w和136nw的区别是什么(hp136w和136nw的区别)

    hp136w和136nw的区别是什么(hp136w和136nw的区别)

  • word转pdf页眉变了(word2007转pdf页眉丢失)

    word转pdf页眉变了(word2007转pdf页眉丢失)

  • 苹果笔记本硬盘不够用怎么办(苹果笔记本硬盘是什么接口)

    苹果笔记本硬盘不够用怎么办(苹果笔记本硬盘是什么接口)

  • 五种常见的计算机病毒种类(五种常见的计算机高级语言)

    五种常见的计算机病毒种类(五种常见的计算机高级语言)

  • 为什么有的人发朋友圈不显示(为什么有的人发了朋友圈又删掉)

    为什么有的人发朋友圈不显示(为什么有的人发了朋友圈又删掉)

  • 电脑cad怎么下载安装(cad下载电脑版免费下载)

    电脑cad怎么下载安装(cad下载电脑版免费下载)

  • 如何把腾讯视频下载到本地(如何把腾讯视频下载的视频导出来)

    如何把腾讯视频下载到本地(如何把腾讯视频下载的视频导出来)

  • qq击掌什么意思(qq击掌失败是怎么回事)

    qq击掌什么意思(qq击掌失败是怎么回事)

  • 快手id登录入口在哪(快手id登录入口官网)

    快手id登录入口在哪(快手id登录入口官网)

  • 手机微信字太小怎么办(手机微信字太小了怎么调大)

    手机微信字太小怎么办(手机微信字太小了怎么调大)

  • iphone11pro怎么复制文字(苹果11pro怎么复制文字)

    iphone11pro怎么复制文字(苹果11pro怎么复制文字)

  • 抖音如何赚钱(抖音如何赚钱?)

    抖音如何赚钱(抖音如何赚钱?)

  • 快手超级管理怎么踢人(快手超级管理怎么禁言)

    快手超级管理怎么踢人(快手超级管理怎么禁言)

  • ipad家长控制如何设置(ipad 家长控制)

    ipad家长控制如何设置(ipad 家长控制)

  • 苹果CMSV10最新大橙子模板使用教程包括苹果CMSV10使用教程和宝塔自动采集教程(苹果cmsv10官网)

    苹果CMSV10最新大橙子模板使用教程包括苹果CMSV10使用教程和宝塔自动采集教程(苹果cmsv10官网)

  • 增值税发票跨年抵扣新政策
  • 递延收益怎么交企业所得税
  • 个体户开运输发票怎么开
  • 小企业会计准则适用于哪些企业
  • 销项税额计算公式13%
  • 应计入企业存货成本有哪些
  • 退休后补发退休前的工资需要扣社保吗
  • 抵减税款用递延收入吗
  • 待摊费用是
  • 已认证的红字发票怎么退
  • 劳务公司购买设备怎么做账
  • 企业所得税以前年度亏损怎么弥补
  • 奖励给优质供应商会计处理怎么做?
  • 车间设备维修费计入制造费用吗
  • 企业注销时有未抵扣的留抵
  • 国税开增值税专票怎么开
  • 增值税普通发票税率
  • 增值税减税措施有哪些
  • 小微企业不超过300万所得税
  • 所得税工资账载怎么算
  • 咨询费如何入账
  • 在会计上主营业务利润和营业利润有什么区别?
  • 企业稀释股份
  • 技术转让减免所得额
  • 两个公司发工资违法吗
  • 外资公司股东要求
  • 在电脑上呢
  • 代买车船税怎么挣钱
  • 外购无形资产发生的交易费用
  • 销售方开红字发票怎么处理
  • 购入嵌入式软件能一次性扣除吗
  • 公司收到银行转账会计分录
  • ios9.3.5如何越狱
  • 如何把文档转换成二维码
  • 往来款能转为投资款的说明
  • 发行股票的手续费、佣金如何会计处理?
  • 明细账是什么样子
  • php的mysql_query
  • 会计分录由什么要素组成
  • 设计费包含概算费用吗
  • 集团内无偿借贷合法吗
  • 格林湖人
  • 员工旅游是什么意思
  • mysql优化总结
  • windows7怎么操作
  • okhttp源码
  • 记 vue-cli-plugin-dll 使用,优化vue-cli项目构建打包速度
  • 经营租赁会计的核算原则
  • 积分兑换业务有风险吗
  • 销售旧货和销售使用过的固定资产区别
  • 汇总记账凭证账务处理
  • 筹资活动产生的现金流量净额减少说明什么
  • 个税是指怎样的税金
  • 红冲发票是什么影响
  • 收入费用表格式
  • 汇算清缴退税怎么回事
  • 在建工程如何结转到产品
  • 员工出差车票属于哪个科目
  • 公司账户转账转错了能退回来吗
  • 一般纳税人的税负率是多少
  • 认缴资金可以增加吗
  • 在产品占用资金属于资产还是负债
  • 员工出国境有关说法
  • 工会经费是什么凭证
  • 什么是速动比率的概念
  • 苹果mac怎么复制文字
  • win内存占用率过高
  • win7右下角的网络连接不显示
  • javascript Ext JS 状态默认存储时间
  • unity3d功能
  • javascript总结笔记
  • jQuery simplePage+AJAX plus分页插件用法实例
  • python 多线程处理
  • 基层税务工作难点重点热点
  • 残保金申报表填写
  • 税控盘换新会影响旧盘数据吗
  • 苏州社保代缴机构查询
  • 消费税的税收筹划ppt
  • 房地产开发企业土地成交额与去年同期相比增长约
  • 出口退税账户标识是否怎么选
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设