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

  • 个税申报表中本期收入怎么填
  • 出租设备的租金收入记入( )账户
  • 外出办事车费计入什么科目
  • 服务费发票的税率是多少
  • 外购商品赠送怎么做账
  • 股权转让给个人和公司的区别
  • 在建工程有增值税发票吗
  • 异地经营如何纳税
  • 在建工程转固定资产账务处理
  • 销售自己使用过的固定资产如何开票
  • 订单式生产管理
  • 库存商品记错了怎样写分录
  • 免费的企业
  • 增值税调整后开具发票
  • 计提水利建设基金的依据
  • 国地税联合财务报表小规模企业需要报送的吗?
  • win11怎么设置声音
  • win10隐藏功能大全
  • 申报个税和缴纳个税一样吗
  • 请问王者荣耀是谁发明的
  • 结转材料采购成本的会计分录是什么
  • 所有者权益会计科目借贷方向
  • 其他应收款可以和其他应付款对冲吗
  • 应用程序无法正常启动0xc000007b
  • 企业法人看病费用能报销吗
  • wordpress.org
  • 企业盘盈资产开什么发票
  • 土地出资是否涉及企业所得税
  • 企业收到对外投资收益交所得税吗
  • 一个非常有用的工具用英语怎么说
  • 广播影视服务需要许可证吗
  • 用php编写从大到小排序
  • 母公司将子公司的资产负债和当期损益
  • 关系抽取系统的要求
  • 微擎框架是开源的吗
  • 上月增值税报表还可以更正吗
  • 资金账簿印花税怎么算
  • 长期股权投资损益调整
  • 将织梦dedecms转换到wordpress
  • 购买监控器计入什么科目
  • 一般纳税人可以转小规模纳税人吗
  • 哪些收据可入账科目
  • 非独立核算门市部销售自产应税消费品
  • 贸易公司委托加工费怎么入账
  • 资本公积怎么计提
  • 公司地址的变更需要哪些资料和手续
  • 公司租赁个人车辆租金多少合适
  • 坏账准备的余额百分比法
  • 专用发票下载怎么操作
  • 出口免费样品怎么做账
  • 自创商誉是否需要纳税
  • 个税专项扣除住房租金标准
  • 分批法成本核算对象
  • 关于职工住房补贴相关文件及规定
  • Windows 2003作中转VPN服务器多路由共享上网的方法
  • gentoo linux优点
  • windows字幕软件
  • 如何激活Win8.1
  • 戴尔dell服务器维修
  • wan 微型端口
  • win8系统怎么取消屏保
  • centos7.7安装
  • xp事件管理器
  • win8桌面一直在闪
  • 搭建android开发环境需要用到哪些工具
  • cocos2dx 2.2.2
  • cocos2dx环境搭建
  • js动态加载图片
  • 杀掉进程windows
  • node.js app
  • eclipse出现an error has occurred
  • 开发Blog整理
  • Python常见格式化字符串方法小结【百分号与format方法】
  • js实现fizzbuzz
  • 前端闭包函数
  • jquery遍历li
  • jquery怎么实现分页功能
  • 收讫付讫是什么意思
  • 公司外购设备对外投资账务处理
  • 从哪个国家进口牛肉
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设