java在使用流生成映射时忽略重复项
Map<String, String> phoneBook = people.stream()
.collect(toMap(Person::getName,
Person::getAddress));
当发现重复的元素时,我得到java.lang.IllegalStateException: Duplicate key
在向映射添加值时是否可以忽略此类异常
当存在重复项时,只需忽略该重复项即可继续
# 1 楼答案
我在对对象进行分组时遇到过这样的问题,我总是用一种简单的方法来解决它们:使用java执行自定义过滤器。util。设置为删除重复的对象,无论您选择什么属性,如下所示
希望这能帮助任何有同样问题的人
# 2 楼答案
@alaster答案对我帮助很大,但如果有人试图对信息进行分组,我想添加一些有意义的信息
例如,如果您有两个
Orders
具有相同的code
但不同的quantity
产品,并且您的愿望是对数量求和,您可以:结果:
或从javadocs组合地址:
# 3 楼答案
用于按对象分组
# 4 楼答案
这可以使用^{} 的
mergeFunction
参数来实现:mergeFunction
是一个对与同一个键关联的两个值进行操作的函数adress1
对应于收集元素时遇到的第一个地址,adress2
对应于遇到的第二个地址:这个lambda只告诉保留第一个地址,而忽略第二个地址# 5 楼答案
如JavaDocs所述:
所以你应该用^{} 来代替。只需提供一个合并功能,该功能将确定在地图中放置哪一个副本
例如,如果你不在乎哪一个,只要打电话就行了
# 6 楼答案
对于遇到此问题但在映射流中没有重复键的任何其他人,确保keyMapper函数没有返回空值
跟踪这一点非常烦人,因为当它处理第二个元素时,异常会说“复制键1”,而1实际上是条目的值而不是键
在我的例子中,我的keyMapper函数试图在不同的映射中查找值,但由于字符串中的键入错误,返回的是null值