将List结果集转成Map<key,Object>或者Map<key,List>

文章介绍了如何通过Java的StreamAPI将List转换成Map,以提高遍历和比较属性的性能。具体方法是用属性作为key,对象或子列表作为value,然后循环固定属性值的列表,从Map中获取对应的value进行操作。文中提供了两个示例,一个是单个对象的Map转换,另一个涉及对象集合的分组处理,展示了在无数据时如何补充默认值。
摘要由CSDN通过智能技术生成

业务背景:有时候我们需要循环List的某个属性,和固定的这个属性List进行比较,如果使用双层for循环 势必形象性能,所以我们可以将List转换成Map,key值就是那个属性,value就是List的里的对象或者,value就是list里的某些List,

譬如 1-24时的每个小时的数据或者数据集合,拿hour作为key将这个List转成Map,然后循环这个1-24个小时的固定list,然后从map里取hour对应key的value,如果非空的话 则表示原list存在,否则不存在,该补0补0该跳过跳过。上代码:

value是List里的元素的情况一:

List<VenueCheckTrendODTO> result=venueManagementDayMapper.venueCheckTrendMonth(startOfMonth,today,deptCode);
        Map<String, VenueCheckTrendODTO> trendMap = result.stream().collect(Collectors.toMap(VenueCheckTrendODTO::getIndex, Function.identity()));
        int dayOfMonth = DateUtil.getDayOfMonth();
        int currentMonthNumber = DateUtil.getCurrentMonthNumber();
        for(Integer day=1;day<=dayOfMonth;day++){
            VenueCheckTrendODTO venueCheckTrendODTO = trendMap.get(day.toString());
            if(venueCheckTrendODTO==null){
                venueCheckTrendODTO=new VenueCheckTrendODTO();
                venueCheckTrendODTO.setCheckNum(0);
                venueCheckTrendODTO.setIndex(day.toString());
                result.add(venueCheckTrendODTO);
            }
        }
//此处是对list进行一个重排序
        result= result.stream().sorted(Comparator.comparing(VenueCheckTrendODTO::getIndex,Comparator.comparingInt(Integer::parseInt))).collect(Collectors.toList());
        result.stream().forEach(trend->{
            trend.setIndex(currentMonthNumber+"-"+trend.getIndex());
        });

value 是list里的一些对象的集合,如果7点可能对应多条数据,这样就需要用的分组了。

List<CarTrendHourODTO> trends=iocCarflowHourPreMapper.selectCarFlowHourTrends(today,deptCode);
        int curHour = Calendar.getInstance().get(Calendar.HOUR_OF_DAY);
        List<IocCarflowHour> actualList=iocCarflowHourMapper.selectCarFlowHourActuals(today,curHour,deptCode);
        Map<String,CarTrendHourODTO> map=trends.stream().collect(Collectors.toMap(CarTrendHourODTO::getIndex, Function.identity()));
        Map<Integer,List<IocCarflowHour>> actualMap=actualList.stream().collect(Collectors.groupingBy(IocCarflowHour::getEnterHour));
        for(Integer hour=7;hour<=23;hour++){
            CarTrendHourODTO carTrendHourODTO=  map.get(hour.toString());
            if(carTrendHourODTO==null){
                //车流预测数据为空需要补0
                carTrendHourODTO=new CarTrendHourODTO();
                //如果没有数据则为空串
                if(curHour>hour){
                    carTrendHourODTO.setTrendAmount("0");
                }else{
                    carTrendHourODTO.setTrendAmount("0");
                }
                trends.add(carTrendHourODTO);
            }
            //车流预测数据非空,判定实际数据是否为空,如果为空则补0
            List<IocCarflowHour> iocCarflowHourList = actualMap.get(hour);
            if(iocCarflowHourList==null){
                if(curHour>hour){
                    carTrendHourODTO.setNum11Amount("0");
                    carTrendHourODTO.setNum12Amount("0");
                    carTrendHourODTO.setNum2Amount("0");
                    carTrendHourODTO.setTotalAmount("0");
                }else{
                    carTrendHourODTO.setNum11Amount("");
                    carTrendHourODTO.setNum12Amount("");
                    carTrendHourODTO.setNum2Amount("");
                    carTrendHourODTO.setTotalAmount("");
                }
            }else{
                for(IocCarflowHour iocCarflowHour:iocCarflowHourList){
                    if(hour.toString().equals(iocCarflowHour.getEnterHour().toString())){
                        if(CommonConstant.PARK1_1_POI_CODE.equals(iocCarflowHour.getPoiCode())){
                            carTrendHourODTO.setNum11Amount(iocCarflowHour.getStayNum().toString());
                        }else if(CommonConstant.PARK1_2_POI_CODE.equals(iocCarflowHour.getPoiCode())){
                            carTrendHourODTO.setNum12Amount(iocCarflowHour.getStayNum().toString());
                        }else if(CommonConstant.PARK2_POI_CODE.equals(iocCarflowHour.getPoiCode())){
                            carTrendHourODTO.setNum2Amount(iocCarflowHour.getStayNum().toString());
                        }
                    }
                }
                carTrendHourODTO.setTotalAmount((Ints.tryParse(carTrendHourODTO.getNum11Amount())+Ints.tryParse(carTrendHourODTO.getNum12Amount())+Ints.tryParse(carTrendHourODTO.getNum2Amount()))+"");
            }
            carTrendHourODTO.setIndex((hour<10?"0"+hour:hour.toString())+":00");
        }
        return trends;

上面的其实是两个业务list,其中第一个list是预期曲线的值,横坐标是hour,第二个list是实际曲线的值,横坐标也是hour,但是第二个list,一条hour对应三条数据,因此使用Collectors.groupingBy

actualList.stream().collect(Collectors.groupingBy(IocCarflowHour::getEnterHour));对hour的数据进行分组,其输出值则为Map<key,list>类型,那边下面在依次对hour映射的value list进行for循环,如图

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力终会有回报

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值