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

  • banner设计网页Addon域完成的企业网站上的企业网站

  • 影响微信营销的要素(影响微信营销的主要因素)

  • 华为nova4后屏是什么材质(华为nova4后屏碎了,容易换吗)

  • 荣耀20pro的耳机孔插哪(荣耀20pro的耳机接口在哪里)

  • 相机内测光的作用(相机内部的测光模块在测光时以18%的中性灰为基准)

  • vivox30怎么分屏(vivox30怎么分屏操作步骤)

  • 酷喵视频显示暂时无法播放(酷喵一直显示即将播放怎么回事)

  • 华为nova4指纹锁怎么设置(华为nova4指纹锁怎么不见了)

  • 笔记本mx250显卡什么级别(笔记本mx250显卡值多少钱)

  • 华为nova6摄像头旁边的黑条是什么(华为nova6摄像头传感器型号)

  • 通用串行总线控制器是什么(通用串行总线控制器没有apple mobile)

  • qq头像为什么变成企鹅(qq头像为什么变成黑色)

  • 手机投屏到电脑要下载什么软件(手机投屏到电脑上怎么操作win10)

  • fla-al10是什么手机(fla-al10是什么手机型号)

  • 苹果x换屏后面容失效(苹果X换屏后面容还能用吗)

  • 怎么才能让手机充电更快(怎么才能让手机屏幕一直亮着)

  • app里的视频怎么保存到本地(app里的视频怎么弄出来)

  • 微信华为运动健康怎么关闭(微信华为运动健康怎么开启)

  • magic14和magic2019区别

  • 苹果id邮箱格式是什么(苹果id邮箱格式忘记了)

  • 手机突然特别卡怎么回事(手机突然特别卡顿)

  • word页面怎么设置16开纸(word页面怎么设置成上下排列)

  • vivox27猜你喜欢怎么关闭(vivox27猜你喜欢怎么去掉)

  • 三星录屏功能在哪呢(三星录屏在哪)

  • wps替换在哪(WPS替换在哪里)

  • 手机不带nfc有什么缺点(手机不带nfc有什么用处)

  • 滴滴2次验证ps能过吗(滴滴身份验证失败多次)

  • 为什么微信没有声音提示(为什么微信没有朋友圈这一项)

  • 手机怎样给公交卡充值(手机怎样给公交车钱)

  • 如何在硬件不受支持的 PC 上安装 Windows11(如何让电脑硬件损坏)

  • rtmservice.exe - rtmservice是什么进程 有什么用

  • JS和TS的区别(ts与js的优缺点)

  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设 电脑维修 湖南楚通运网络