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

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

解决:

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

lambda表达式在解决java后台分组排序时的应用的更多相关文章

  1. 行为参数化与lambda表达式 - 读《Java 8实战》

    零. 概述 第一部分:1~3章 主要讲了行为参数化和Lambda表达式 第二部分:4~7章 主要讲了流的应用,包括流与集合差异,流的操作,收集器,注的并行执行 第三部分:8~12章 主要讲了怎样用Ja ...

  2. 解决Java POI 导出Excel时文件名中文乱码,兼容浏览器

    String agent = request.getHeader("USER-AGENT").toLowerCase(); response.setContentType(&quo ...

  3. 掌握 Java 8 Lambda 表达式

    Lambda 表达式 是 Java8 中最重要的功能之一.使用 Lambda 表达式 可以替代只有一个函数的接口实现,告别匿名内部类,代码看起来更简洁易懂.Lambda 表达式 同时还提升了对 集合 ...

  4. 聊聊Java 8 Lambda 表达式

      早在2014年oracle发布了jdk 8,在里面增加了lambda模块.于是java程序员们又多了一种新的编程方式:函数式编程,也就是lambda表达式.我自己用lambda表达式也差不多快4年 ...

  5. Java 终于有 Lambda 表达式啦~Java 8 语言变化——Lambda 表达式和接口类更改【转载】

    原文地址 en cn 下载 Demo Java™ 8 包含一些重要的新的语言功能,为您提供了构建程序的更简单方式.Lambda 表达式 为内联代码块定义一种新语法,其灵活性与匿名内部类一样,但样板文件 ...

  6. Java 8 Lambda表达式,让你的代码更简洁

    Lambda表达式是Java 8一个非常重要的新特性.它像方法一样,利用很简单的语法来定义参数列表和方法体.目前Lambda表达式已经成为高级编程语言的标配,像Python,Swift等都已经支持La ...

  7. Java 常用的几个lambda表达式

    Lambda表达式是Java 8一个非常重要的新特性.它像方法一样,利用很简单的语法来定义参数列表和方法体.目前Lambda表达式已经成为高级编程语言的标配,像Python,Swift,C#等都已经支 ...

  8. java函数式编程之lambda表达式

    作为比较老牌的面向对象的编程语言java,在对函数式编程的支持上一直不温不火. 认为面向对象式编程就应该纯粹的面向对象,于是经常看到这样的写法:如果你想写一个方法,那么就必须把它放到一个类里面,然后n ...

  9. Java :一文掌握 Lambda 表达式

    本文将介绍 Java 8 新增的 Lambda 表达式,包括 Lambda 表达式的常见用法以及方法引用的用法,并对 Lambda 表达式的原理进行分析,最后对 Lambda 表达式的优缺点进行一个总 ...

随机推荐

  1. 解决报错:ERROR 1005 (HY000): Can't create table 'market.orders' (errno: 150)

    1.描述问题: 在这里我新建了两张表(customers_info和orders) 表一:customers_info CREATE TABLE customers_info ( c_num INT( ...

  2. ubuntu19.04 安装mysql,没有初始密码,重设初始密码

    1.安装 在终端下输入 sudo apt-get install mysql-server mysql-client 进行安装,如果安装过程中弹出密码输入提示,则正常安装即可! 2.由于没有出现密码设 ...

  3. 关于RTP时间戳及多媒体通信同步的问题(转)

    文章转载自:罗索实验室 [http://www.rosoo.net/a/201101/10776.html]

  4. Python中的模块简单认识

    将自己定义的方法,变量存放在文件中,为一些脚本或者交互式的解释器实例使用,这个文件称为模块. 细说的话,模块可以分为四个通用类别: 1 使用python编写的.py文件(自定义模块) 2 已被编译为共 ...

  5. JS高级---继承

    继承 面向对象编程思想: 根据需求, 分析对象, 找到对象有什么特征和行为, 通过代码的方式来实现需求, 要想实现这个需求,就要创建对象 ,要想创建对象, 就应该显示有构造函数, 然后通过构造函数来创 ...

  6. cmd命令和快捷键

    命令 含义 盘名: 从C盘到其他盘时输入 dir 查看当前文件夹下的内容 cd 目录名称 选择目录 cd.. 退回当前目录的上一级目录 cd\ 回到根目录 md 目录名称 创建目录 rd 目录名称 删 ...

  7. python之路之面向对象3

    一.知识点拾遗 1.多继承的易错点 二.设计模式 1.设计模式介绍 Gof设计模式 大话设计模式 2.单例模式 当所有实例中封装的数据相同时,使用单例模式 静态方法+静态字段 单例就是只有一个实例 a ...

  8. eclipse非正常关闭,再打开后报错

    Previous operation has not finished; run 'cleanup' if it was interrupted 启动任务管理器,将javaw.exe进程杀死,然后重启 ...

  9. cookie不支持中文,必须转码后存储,否则会乱码

    cookie不支持中文,必须转码后存储,否则会乱码 Cookie ck = new Cookie("username", URLEncoder.encode(name, " ...

  10. CentOS安装docker,及其基本操作

    CentOS安装docker,及其基本操作 一.安装docker Docker要求运行在Centos 7上,要求系统为64位,系统内核版本3.10以上 1.uname -an 查看当前系统版本 2.y ...