使用场景:
在实际应用开发中,会常把一个List的查询数据集合转为一个Map,那么在这里的 list.stream().collect()其实就是做了这么一件事情,它是java8的stream方式实现的它是以type为key,以entity对象为value构成Map。
//查询
List<QuestionCategoryEntity> list = questionCategoryService.selectList(entityWrapper);
Map<String, String> categoryMap = list.stream().collect(
Collectors.toMap(
QuestionCategoryEntity::getCategoryCode,
QuestionCategoryEntity::getCategoryName
)
);
在有些业务场景中会出现如下异常:Duplicate key ,map的key重复,如上的 QuestionCategoryEntity::getCategoryCode。
java.lang.IllegalStateException: Duplicate key 专项考试
at java.util.stream.Collectors.lambda$throwingMerger$0(Collectors.java:133)
at java.util.HashMap.merge(HashMap.java:1245)
at java.util.stream.Collectors.lambda$toMap$58(Collectors.java:1320)
at java.util.stream.ReduceOps$3ReducingSink.accept(ReduceOps.java:169)
at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1374)
... ...
解决方法:
使用toMap()的重载方法,如果已经存在则不再修改,直接使用上一个数据。
//查询
List<QuestionCategoryEntity> list = questionCategoryService.selectList(entityWrapper);
Map<String, String> categoryMap = list.stream().collect(
Collectors.toMap(
QuestionCategoryEntity::getCategoryCode,
QuestionCategoryEntity::getCategoryName,
(entity1, entity2) -> entity1
)
);
等效于
questionCategoryService.selectList(entityWrapper);
Map<String, String> categoryMap = list.stream().collect(
Collectors.toMap(
QuestionCategoryEntity::getCategoryCode,
QuestionCategoryEntity::getCategoryName,
(entity1, entity2) {
return entity1
}
)
);
(entity1, entity2) -> entity1 这里使用的箭头函数,也就是说当出现了重复key的数据时,会回调这个方法,可以在这个方法里处理重复Key数据问题,小编这里粗暴点,直接使用了上一个数据。
今天的文章java.lang.IllegalStateException: Duplicate key异常解决分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/32739.html