List转Map

最近工作遇到一点小难题,我钻进了死胡同以至于写了一大堆的无用代码。

其实很简单,就是从多个list里面取id相同的数据插入数据库,我当时的思路是遍历每个List,存入Map里面,然后我又想,map的key相同的话,不就把数据给覆盖了,那我还存map里面干嘛,然后我又自定义map的key,这样确实解决了key重复的问题,但是有出现的问题是怎么取value里面的值……试了各种方法还是不行。

领导给我提供的思路是,把list转为map 然后在定义一个新的map 把list转过的map 存入新的map里面,新的map的key重复覆盖值也没问题,因为我想拿到key,最后在遍历ist转的map, 判断其key 是否在新的map里面,如果有 拿数据 这样完美的解决问题!自己还是太年轻….

代码片段如下:

// 查询一般业务的专用销售额 销税额 价税额 公司名
Map<Long, TaxReportMoneyAndCompanyEntity> ybzyMap = list.stream().collect(toMap(TaxReportMoneyAndCompanyEntity::getCompanyId, a -> a, (k1, k2) -> k1));
allMap.putAll(ybzyMap);

// 查询一般业务的其他销售额 销税额  公司名
Map<Long, TaxReportMoneyAndCompanyEntity> ybqtMap = list1.stream().collect(Collectors.toMap(TaxReportMoneyAndCompanyEntity::getCompanyId, a -> a, (k1, k2) -> k1));
allMap.putAll(ybqtMap);

for (Long companyId : allMap.keySet()) {
               if (ybzyMap.containsKey(companyId)) {
                   log.info("first map begin");
                   allMap.get(companyId).setXm(item);
                   allMap.get(companyId).setSl(BigDecimal.valueOf(Double.parseDouble(sl)));
                   allMap.get(companyId).setCompanyId(ybzyMap.get(companyId).getCompanyId());
                   allMap.get(companyId).setYbzpje(ybzyMap.get(companyId).getYbzpje());
                   allMap.get(companyId).setYbzpse(ybzyMap.get(companyId).getYbzpse());
                   allMap.get(companyId).setYbhjjshj(ybzyMap.get(companyId).getYbhjjshj());
                   allMap.get(companyId).setCreateDate(new Date());
                   log.info("first map over");
               }
}

用到的技术是jak8的新特性:

– List -> Map

– 需要注意的是:

– toMap 如果集合对象有重复的key,会报错Duplicate key 

– 假设companyID的id都为1。

– 可以用 (k1,k2)->k1 来设置,如果有重复的key,则保留key1,舍弃key2

Map<Long, TaxReportMoneyAndCompanyEntity> ybzyMap = list.stream().collect(toMap(TaxReportMoneyAndCompanyEntity::getCompanyId, a -> a, (k1, k2) -> k1));


发表评论