java 8 Collectors.toMap 重复key 值处理、value为null处理
public static void main(String[] args) {// 查询客户主证件信息 代码省略// 获取客户证件列表List<Map<String,Object>> custCertificateList = (List<Map<String, Object>>) idenMap.get("custCertificateList"
·
1、重复key处理
public static void main(String[] args) {
// 查询客户主证件信息 代码省略
// 获取客户证件列表
List<Map<String,Object>> custCertificateList = (List<Map<String, Object>>) idenMap.get("custCertificateList");
// 将证件以客户维度封装,该写法如果一个客户出现多个主证件信息,会报错。
Map<String,Map<String,String>> custIdenMap = custCertificateList.stream().collect(Collectors.toMap(e -> (String) e.get("custNo"), e -> UtilMisc.toMap("idType", (String) e.get("idType"), "idNo", (String) e.get("idNo")));
// 为防止以上错误,可用下面写法:添加(oldData,newData)->oldData) ,出现重复值,用第一个值
Map<String,Map<String,String>> custIdenMap = custCertificateList.stream().collect(Collectors.toMap(e -> (String) e.get("custNo"), e -> UtilMisc.toMap("idType", (String) e.get("idType"), "idNo", (String) e.get("idNo")),(oldData,newData)->oldData));
}
2、Collectors.toMap 时,key可以为null,但 value不能为null
Collectors.toMap 时,key可以为null,但 value不能为null, 否则抛空指针异常nullPointerException
原因说明:
Collectors.toMap调用的Map.merge方法,该方法中value不能为空。 
如果此时使用如下代码,出现birthDate为null的情况,则会报错。

解决办法:
1、既然时merge方法造成的,那就不调merge方法。 我们用自己定义的accumulator,用Stream的另一个collect方法
<R> R collect(Supplier<R> supplier,
BiConsumer<R, ? super T> accumulator,
BiConsumer<R, R> combiner);
修改后代码:

当然(map1,map2)->map1.putAll(map2) 也可以简化成HashMap::putAll
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐



所有评论(0)