软件编程
位置:首页>> 软件编程>> java编程>> lambda表达式解决java后台分组排序过程解析

lambda表达式解决java后台分组排序过程解析

作者:德邦总管  发布时间:2023-11-29 06:03:39 

标签:lambda,表达式,java,后台,分组,排序

需求:按照起始日期查询出数据库里一段连续日期的住院信息。

问题:数据库里的住院信息可能不是完整的,也就是在给出的日期区间里只有若干天的数据,缺少某些日期的数据。

解决:

1.需要我们先按日期分组查出数据库里有的数据;

2.然后遍历日期,将不存在的日期以日期为key,value为null插入集合里;

3.对集合里的key即日期进行排序。

注:这里分组和排序都用JDK8的新特性lambda表达式


/**
  *
  * @param startTime 开始时间
  * @param endTime  结束时间
  * @param tbOrderExecutionExample 模糊查询
  * @return 结果集
  * @throws ParseException 转换异常
  */
 private Map<String, List<TBOrderExecution>> getListMap(@RequestParam(value = "startTime", required = false) String startTime, @RequestParam(value = "endTime", required = false) String endTime, TBOrderExecutionExample tbOrderExecutionExample) throws ParseException {
   List<TBOrderExecution> list = tbDocOrderAdmissionService.selectByExample(tbOrderExecutionExample);
   //获取时间段分组
   SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd");
   List<String> lists = DateRangUtil.getAllDate(startTime, endTime);
   Map<String, List<TBOrderExecution>> map = list.stream().collect(Collectors.groupingBy(x -> sdf2.format(x.getYzjhksrq())));
   Set<String> keys = map.keySet();
   Map<String, List<TBOrderExecution>> finalMap = map;
   lists.forEach(ele -> {
     if (!keys.contains(ele)) {
       finalMap.put(ele, null);
     }

});
   Map<String, List<TBOrderExecution>> finalMaps = new LinkedHashMap<>();
   Set<String> strings = finalMap.keySet();
   List<String> dates = new ArrayList<>(strings);
   DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
   Collections.sort(dates, new Comparator<String>() {
     DateFormat f = new SimpleDateFormat("yyyy-MM-dd");

@Override
     public int compare(String o1, String o2) {
       try {
         return f.parse(o1).compareTo(f.parse(o2));
       } catch (ParseException e) {
         throw new IllegalArgumentException(e);
       }
     }
   });
   dates.forEach(ele -> {
     finalMap.forEach((key, value) -> {
       if (key.equals(ele)) {
         finalMaps.put(ele, value);
       }
     });
   });
   return finalMaps;
 }

下面贴出生成给定起始日期生成连续日期的代码:


public static List<String> getAllDate(String start, String end) throws ParseException {
   List<Date> lDate = new ArrayList<>();
   SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
   Date dBegin = sdf.parse(start);
   Date dEnd = sdf.parse(end);

lDate.add(dBegin);
   Calendar calBegin = Calendar.getInstance();
   // 使用给定的 Date 设置此 Calendar 的时间
   calBegin.setTime(dBegin);
   Calendar calEnd = Calendar.getInstance();
   // 使用给定的 Date 设置此 Calendar 的时间
   calEnd.setTime(dEnd);
   // 测试此日期是否在指定日期之后
   while (dEnd.after(calBegin.getTime())) {
     // 根据日历的规则,为给定的日历字段添加或减去指定的时间量
     calBegin.add(Calendar.DAY_OF_MONTH, 1);
     lDate.add(calBegin.getTime());
   }
   List<String> allDate = new ArrayList<>();
   lDate.forEach(ele -> allDate.add(sdf.format(ele)));
   return allDate;

}

来源:https://www.cnblogs.com/zhncnblogs/p/11647111.html

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com