lambda表达式解决java后台分组排序过程解析
需求:按照起始日期查询出数据库里一段连续日期的住院信息。
问题:数据库里的住院信息可能不是完整的,也就是在给出的日期区间里只有若干天的数据,缺少某些日期的数据。
解决:
1.需要我们先按日期分组查出数据库里有的数据;
2.然后遍历日期,将不存在的日期以日期为key,value为null插入集合里;
3.对集合里的key即日期进行排序。
注:这里分组和排序都用JDK8的新特性lambda表达式
/** * *@paramstartTime开始时间 *@paramendTime结束时间 *@paramtbOrderExecutionExample模糊查询 *@return结果集 *@throwsParseException转换异常 */ privateMap>getListMap(@RequestParam(value="startTime",required=false)StringstartTime,@RequestParam(value="endTime",required=false)StringendTime,TBOrderExecutionExampletbOrderExecutionExample)throwsParseException{ List list=tbDocOrderAdmissionService.selectByExample(tbOrderExecutionExample); //获取时间段分组 SimpleDateFormatsdf2=newSimpleDateFormat("yyyy-MM-dd"); List lists=DateRangUtil.getAllDate(startTime,endTime); Map >map=list.stream().collect(Collectors.groupingBy(x->sdf2.format(x.getYzjhksrq()))); Set keys=map.keySet(); Map >finalMap=map; lists.forEach(ele->{ if(!keys.contains(ele)){ finalMap.put(ele,null); } }); Map >finalMaps=newLinkedHashMap<>(); Set strings=finalMap.keySet(); List dates=newArrayList<>(strings); DateTimeFormatterformatter=DateTimeFormatter.ofPattern("yyyy-MM-dd"); Collections.sort(dates,newComparator (){ DateFormatf=newSimpleDateFormat("yyyy-MM-dd"); @Override publicintcompare(Stringo1,Stringo2){ try{ returnf.parse(o1).compareTo(f.parse(o2)); }catch(ParseExceptione){ thrownewIllegalArgumentException(e); } } }); dates.forEach(ele->{ finalMap.forEach((key,value)->{ if(key.equals(ele)){ finalMaps.put(ele,value); } }); }); returnfinalMaps; }
下面贴出生成给定起始日期生成连续日期的代码:
publicstaticListgetAllDate(Stringstart,Stringend)throwsParseException{ List lDate=newArrayList<>(); SimpleDateFormatsdf=newSimpleDateFormat("yyyy-MM-dd"); DatedBegin=sdf.parse(start); DatedEnd=sdf.parse(end); lDate.add(dBegin); CalendarcalBegin=Calendar.getInstance(); //使用给定的Date设置此Calendar的时间 calBegin.setTime(dBegin); CalendarcalEnd=Calendar.getInstance(); //使用给定的Date设置此Calendar的时间 calEnd.setTime(dEnd); //测试此日期是否在指定日期之后 while(dEnd.after(calBegin.getTime())){ //根据日历的规则,为给定的日历字段添加或减去指定的时间量 calBegin.add(Calendar.DAY_OF_MONTH,1); lDate.add(calBegin.getTime()); } List allDate=newArrayList<>(); lDate.forEach(ele->allDate.add(sdf.format(ele))); returnallDate; }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。