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

  • 网银数字证书年费计入什么科目
  • 发票上是17%的税率吗
  • 单位边际贡献和边际贡献一样吗
  • 高新技术企业入库难吗
  • 工程总包如何开具发票和征税
  • 收到补价时应确认收益,支付补价时不能确认收益
  • 年底结账会计分录一定要做吗
  • 应交税费账户期末借方余额反映的是
  • 车辆保险可以开票吗
  • 以股权转让名义转让土地使用权
  • 租入房产改建增值税谁交
  • 咨询费可以入账吗
  • 易票365怎么认证发票
  • 公司筹建期的个税怎么交
  • 固定资产进项税额怎么抵扣
  • 金蝶用户管理怎么设置
  • 实收资本增加印花税缴纳时间
  • 购买食堂餐具开票怎么开
  • 期间损益结转怎么结转
  • 收到赞助费开什么发票
  • 党费专用账户可以收取转账费用吗
  • 税金及附加包括个人所得税吗
  • 其他货币资金包括哪些项目
  • win10如何禁止
  • 没有取得发票的支出可以做成本吗
  • iphone11 iphone10区别
  • 工程质保金账务处理办法
  • 简易计税办法和一般计税办法
  • 苹果客服人工24小时
  • 斯科默岛白玉草丛中的海鹦,威尔士彭布罗克郡 (© Ross Hoddinott/Minden Pictures)
  • php stomp
  • 帮别人开增值税专用发票
  • 已抵扣认证的发票开红字发票需要将原票退回吗
  • 市职工报销比例多少
  • 出售债券税费处理会计分录怎么写
  • 英雄联盟轮转模式2020时间表
  • elementui的upload组件详解
  • Web 1.0、Web 2.0 和 Web 3.0 之间的比较
  • vue路由跳转携带参数怎么接收
  • php计时函数
  • 融资租赁的残值归出租人所有,为啥要减去租金限值
  • 企业研发费用加计扣除比例
  • 按摊余成本计量的应收账款
  • 日常收集整理常用工具
  • sqlserver2019查看表
  • 资产捐赠账务处理
  • 新办商贸企业是国企吗
  • 加速折旧法是指在固定资产使用的早期少提折旧
  • sql2000错误9003
  • sql row_number()over()
  • 军工科研事业单位会计制度
  • 以前年度费用退回
  • 新收入准则确认收入的条件
  • 房地产企业拆迁补偿费入账要求
  • 注销退税后又补税了
  • 应收账款增加给哪一方
  • 贷款保险费由谁承担
  • 汽车生产企业三大战略
  • 结算专用章是财务章吗
  • 电脑开机出现英文字母开不了机
  • win7系统怎么修复安装系统
  • 硬盘安装后不显示
  • keyemain.exe是什么进程
  • win7系统开启无线服务
  • 苹果mac电脑怎么复制粘贴
  • linux监控软件zabbix
  • win10周年版
  • js动态改变div内容
  • nodejs mysql库
  • python中csv怎么用
  • django教程推荐
  • boost源码编译
  • 安卓 旋转屏幕
  • 广东省电子税务局电话
  • 河北省国家税务局电子税务局官网入口
  • 车辆购置税需要每年都交吗
  • 重庆税务局发票作废怎么处理
  • 预缴增值税是否要预缴城建税及附加
  • 每月社保缴费截止日期
  • 奔驰g500落地多少
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设