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

  • 企业借款给个人利息如何处理
  • 移动怎么开当月发票
  • 发票收款人和复核人、收款人规定
  • 个人开具发票需要税号吗
  • 社保基数在哪里调整
  • 未确认融资收益对应的科目是什么
  • 预收款转营业外收入条件
  • 单位多久查一次征信
  • 印花税交完有什么凭证
  • 固定资产折旧财务
  • 股权转让涉及房屋产权变更怎么办
  • 融资租赁固定资产会计处理
  • 收到报废车款要交什么税
  • 劳务费发票可以含材料费吗
  • 如何知道企业是查账征收还是核定征收
  • 所得税为负值是什么意思
  • 差额纳税销项税额抵减
  • 自然人销售固定资产
  • 注册资金印花税是资金账簿吗
  • 仓储费专用发票可以抵扣吗?
  • 个税没有扣除项,需要填写和确认吗
  • 支票能够拿来付款吗
  • 资金清算款项
  • 进口原材料的关税怎么算
  • 外省工程需要什么手续
  • 高新补贴是什么意思
  • 跨年度的费用发票可以入账吗
  • 怎么在bios中开启硬件虚拟化
  • 冲销货款的会计分录
  • 苹果手机查找对方手机位置看不到
  • 季度交企业所得税是按照什么来交的
  • 营改增全面推开为什么还叫试点
  • 航天信息服务费发票哪里打印
  • 哪些费用可以在开办费中列支
  • vue项目部署上线 需要做哪些准备
  • thinkphp jquery实现图片上传和预览效果
  • 背书转让的步骤
  • vue.js过滤器
  • 科目汇总表借方发生额等于贷方发生额吗
  • redis提供了对值进行运算的命令
  • 记账凭证的记账符号要打勾吗
  • 预收账款是否需入账
  • 厂房出租一年多少钱
  • sqlite3 top的查询及limit语法介绍
  • 主管盾和制单盾是是转账使用的U盾吗?
  • 企业股东分红可抵税吗
  • 税款要在15号前扣吗
  • 房屋租赁费需要分摊吗
  • 工会经费税务代收是什么意思
  • 公积金发票掉了怎么办
  • 个体工商户需要给员工交社保吗
  • 信用减值损失属于公允价值变动收益吗
  • 分配利润时会计分录
  • 新入股公司股权转让
  • 合作建房土地增值税清算案例
  • 餐饮行业购入农产品
  • 公司购买的财产保险要交印花税吗
  • 企业叉车折旧年限几年
  • 文化事业建设费税收优惠政策2022
  • 典当行收房产证吗直接可以拿钱吗
  • 职工薪酬包括的内容
  • 建厂房之前需要什么条件
  • 关闭默认共享的影响
  • win8安装程序在哪里
  • win8.1怎么用
  • win10怎么显示磁盘已用空间
  • win7如何隐藏文件夹最近使用记录
  • win10系统onenote不能用
  • bootstrap表单模板
  • 用jquery制作网页
  • node.js gui
  • 用python写网页
  • javascript参考书
  • unity3d官方教程
  • python解析算法
  • 发票与报销内容不一样
  • 我国税务师事务所有哪些
  • 广西国家税务局于红林
  • 机场停车票怎么取得
  • 税务稽查机构
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设