lambda表达式解决java后台分组排序过程解析
时间:2021-04-14 09:03:19|栏目: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;
}
上一篇:Java内存结构和数据类型
栏 目:JAVA代码
下一篇:SpringBoot Jpa 自定义查询实现代码详解
本文标题:lambda表达式解决java后台分组排序过程解析
本文地址:http://www.codeinn.net/misctech/100831.html


阅读排行
- 1Java Swing组件BoxLayout布局用法示例
- 2java中-jar 与nohup的对比
- 3Java邮件发送程序(可以同时发给多个地址、可以带附件)
- 4Caused by: java.lang.ClassNotFoundException: org.objectweb.asm.Type异常
- 5Java中自定义异常详解及实例代码
- 6深入理解Java中的克隆
- 7java读取excel文件的两种方法
- 8解析SpringSecurity+JWT认证流程实现
- 9spring boot里增加表单验证hibernate-validator并在freemarker模板里显示错误信息(推荐)
- 10深入解析java虚拟机




