首页 > 编程 > Java > 正文

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

2019-11-26 08:29:57
字体:
来源:转载
供稿:网友

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

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

解决:

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;  }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持武林网。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表