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

  • 预提费用
  • 残保金滞纳金能超过本金吗
  • 公司向法人还回借款现金的分录
  • 固定资产报废属于非常损失吗
  • 委托贷款利息如何计算
  • 不动产租赁发票怎么开
  • 预付房租收到发票怎么做
  • 专票当成普票入账怎么调整
  • 临时聘用人员费用谁承担
  • 内部企业借款利息在建工程资本化
  • 原材料当废品卖怎么处理
  • 期初建账以前年度损益调整怎么转?
  • 电子银行承兑汇票可以拆开吗
  • 免抵退分录怎么做
  • 税收滞纳金算不算所得税
  • 没有缴纳社保怎么开证明
  • 营改增后工程税收怎么计算
  • 其他应收款借方表示增加吗
  • 银行利息所得税调整方案
  • 地方教育费附加计入什么科目
  • 制造费用包括哪些费用项目
  • 公司付电费发票怎么做账
  • 房产交易差价
  • 生产企业出口退税申报系统详细操作流程
  • win10玩游戏提示内存不足无法处理此命令
  • linux minor
  • 公司开业前启动大会
  • linux系统中的文件访问权限包括几种
  • 资产减值损失会影响营业利润吗
  • phppregmatch
  • Pycharm安装库失败
  • php写文件函数
  • 未按规定采取预防措施,导致发生严重突发事件的
  • mybitas分页
  • vue 实战
  • 未核定税种是谁的责任
  • vue叠化在哪里
  • 销项税的分录怎么做
  • php验证表单方法有哪些
  • 共管账户可以转账吗
  • 微信小程序项目中app.js文件是全局样式文件
  • Python web开发基础教程的心得
  • 牛客前端刷题怎么样
  • bash的主要功能
  • 可以主营业务成本增加现金减少吗
  • 进项加计抵减会计分录怎么做
  • 免缴纳的增值税怎么做账
  • 预提管理费用怎么计算
  • 国债 企业
  • 签三方协议需要法人本人去吗
  • 什么情况下需要做心脏造影
  • 商场返现活动怎么入账
  • 福利费的进项税额可以抵扣吗
  • 不签订购销合同的后果
  • 固定资产抵扣进项税额最新规定
  • 长期合同价格怎么定
  • 企业弥补亏损的顺序
  • 行政事业单位固定资产入账标准最新规定
  • 年利率怎么算计算器
  • win8pe无法识别硬盘
  • windows xp sp4 下载 windows xp sp4补丁包(非官方)
  • win7系统屏幕键盘怎么打开
  • 微软停止对xp的操作
  • linux常用命令 cat
  • 注册表 windows
  • win10 累积更新
  • win7取消禁用无线网络
  • 电脑迅雷影音在哪个文件夹
  • cocos怎么用
  • js的split用法
  • jquery实现图片懒加载
  • 深入理解新发展理念,推进供给侧结构性改革心得体会
  • perl中sub
  • 如何查看驱动器
  • unity3d知乎
  • js调用css动画
  • 基于zepto的移动端轻量级日期插件--date_picker
  • 大连税务登记app
  • 贝壳的贝壳分
  • 武汉市江汉区财政局这个单位的公务员待遇怎么样?
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设