关于 Stream 转 Map 的 Duplicate key 异常处理
1.问题复现
先初始化一个 School 的集合,然后将该集合转成一个 Map,key 为 id, value 为 name。注:学校的 id 设置为重复的。上代码:
复制代码
运行以上代码,控制台会出现以下错误:
复制代码
原因就是转换为 map 的时候 key 重复了。
2.解决方案
对于以上问题,是因为我们使用的方法不对,java8 的 Collectors 的 toMap 有三个重载方法:
复制代码
上面的代码使用的就是第一个,我们看下该方法的注释就明白了:
返回一个将元素累积到 Map 中的收集器,其键和值是将提供的映射函数应用于输入元素的结果。如果映射的键包含重复项(根据 Object.equals(Object)),则在执行集合操作时会抛出 IllegalStateException。 如果映射的键可能有重复项,请改用 toMap(Function, Function, BinaryOperator)。
所以答案就在里面,如果有映射的键有重复项就会报错,我们应该使用第二个方法,所以上面的代码我们略作修改即可,当碰到相同的键时,用后面的 value 覆盖前面的。
复制代码
代码跑起来,打印结果如下:
复制代码
版权声明: 本文为 InfoQ 作者【方明】的原创文章。
原文链接:【http://xie.infoq.cn/article/f4d4221d0c7077b2146b45827】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论