lambda表达式在解决java后台分组排序时的应用

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

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

解决:

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

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

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

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

 1 /**
 2      *
 3      * @param startTime 开始时间
 4      * @param endTime   结束时间
 5      * @param tbOrderExecutionExample 模糊查询
 6      * @return 结果集
 7      * @throws ParseException 转换异常
 8      */
 9     private Map<String, List<TBOrderExecution>> getListMap(@RequestParam(value = "startTime", required = false) String startTime, @RequestParam(value = "endTime", required = false) String endTime, TBOrderExecutionExample tbOrderExecutionExample) throws ParseException {
10         List<TBOrderExecution> list = tbDocOrderAdmissionService.selectByExample(tbOrderExecutionExample);
11         //获取时间段分组
12         SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd");
13         List<String> lists = DateRangUtil.getAllDate(startTime, endTime);
14         Map<String, List<TBOrderExecution>> map = list.stream().collect(Collectors.groupingBy(x -> sdf2.format(x.getYzjhksrq())));
15         Set<String> keys = map.keySet();
16         Map<String, List<TBOrderExecution>> finalMap = map;
17         lists.forEach(ele -> {
18             if (!keys.contains(ele)) {
19                 finalMap.put(ele, null);
20             }
21
22         });
23         Map<String, List<TBOrderExecution>> finalMaps = new LinkedHashMap<>();
24         Set<String> strings = finalMap.keySet();
25         List<String> dates = new ArrayList<>(strings);
26         DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
27         Collections.sort(dates, new Comparator<String>() {
28             DateFormat f = new SimpleDateFormat("yyyy-MM-dd");
29
30             @Override
31             public int compare(String o1, String o2) {
32                 try {
33                     return f.parse(o1).compareTo(f.parse(o2));
34                 } catch (ParseException e) {
35                     throw new IllegalArgumentException(e);
36                 }
37             }
38         });
39         dates.forEach(ele -> {
40             finalMap.forEach((key, value) -> {
41                 if (key.equals(ele)) {
42                     finalMaps.put(ele, value);
43                 }
44             });
45         });
46         return finalMaps;
47     }

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

 1 public static List<String> getAllDate(String start, String end) throws ParseException {
 2         List<Date> lDate = new ArrayList<>();
 3         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
 4         Date dBegin = sdf.parse(start);
 5         Date dEnd = sdf.parse(end);
 6
 7         lDate.add(dBegin);
 8         Calendar calBegin = Calendar.getInstance();
 9         // 使用给定的 Date 设置此 Calendar 的时间
10         calBegin.setTime(dBegin);
11         Calendar calEnd = Calendar.getInstance();
12         // 使用给定的 Date 设置此 Calendar 的时间
13         calEnd.setTime(dEnd);
14         // 测试此日期是否在指定日期之后
15         while (dEnd.after(calBegin.getTime())) {
16             // 根据日历的规则,为给定的日历字段添加或减去指定的时间量
17             calBegin.add(Calendar.DAY_OF_MONTH, 1);
18             lDate.add(calBegin.getTime());
19         }
20         List<String> allDate = new ArrayList<>();
21         lDate.forEach(ele -> allDate.add(sdf.format(ele)));
22         return allDate;
23
24     }

原文地址:https://www.cnblogs.com/zhncnblogs/p/11647111.html

时间: 2024-11-15 17:29:25

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

c# Linq及Lambda表达式应用经验之 GroupBy 分组 count ,排序

引用:http://www.cnblogs.com/han1982/p/4138163.html 示例1: GroupBy 分组在List<>泛型中的应用 原表: 按姓名Nam 分组后结果: 对DATATABLE 进行LAMDA查询时必须在项目的引用中添加 System.Data.DataSetExtensions public partial class Form1 : Form { public Form1() { InitializeComponent(); } List<Pers

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

零. 概述 第一部分:1~3章 主要讲了行为参数化和Lambda表达式 第二部分:4~7章 主要讲了流的应用,包括流与集合差异,流的操作,收集器,注的并行执行 第三部分:8~12章 主要讲了怎样用Java8引入的特性改善老代码,Optional类和CompleteFuture及新的日期和时间API 第四部分:13~16章 主要讲了函数式编程 本文主要是对第一部分的笔记. 一.行为参数化 1.1 行为参数化定义 行为参数化就是拿出一个代码块,把它准备好却不去执行它. 1.2 举例:需求 有个果农,

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

String agent = request.getHeader("USER-AGENT").toLowerCase();   response.setContentType("application/vnd.ms-excel");   String fileName = "文件名";   String codedFileName = java.net.URLEncoder.encode(fileName, "UTF-8");

环信java后台发送消息时提示msg 应该为JSONObject 的坑

解决了 ,问题不在传TextMessageBody 的msg参数的json格式,而是TextMessageBody 本身的getbody方法有问题.    public ContainerNode<?> getBody() {        if (!isInit()) {            // this.getMsgBody().put("type", MsgType.TEXT);            // this.getMsgBody().put("

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

原文地址 en cn 下载 Demo Java? 8 包含一些重要的新的语言功能,为您提供了构建程序的更简单方式.Lambda 表达式 为内联代码块定义一种新语法,其灵活性与匿名内部类一样,但样板文件要少得多.接口更改使得接口可以添加到现有接口中,同时又不会破坏与现有代码的兼容性.本文将了解这些更改是如何协同工作的. Java 8 的最大变化在于添加了对 lambda 表达式 的支持.Lambda 表达式是可按引用传递的代码块.类似于一些其他编程语言中的闭包:它们是实现某项功能的代码,可接受一个

【Java学习笔记之三十一】详解Java8 lambda表达式

Java 8 发布日期是2014年3月18日,这次开创性的发布在Java社区引发了不少讨论,并让大家感到激动.特性之一便是随同发布的lambda表达式,它将允许我们将行为传到函数里.在Java 8之前,如果想将行为传入函数,仅有的选择就是匿名类,需要6行代码.而定义行为最重要的那行代码,却混在中间不够突出.Lambda表达式取代了匿名类,取消了模板,允许用函数式风格编写代码.这样有时可读性更好,表达更清晰.在Java生态系统中,函数式表达与对面向对象的全面支持是个激动人心的进步.将进一步促进并行

Java 8 Lambda表达式10个示例【存】

PS:不能完全参考文章的代码,请参考这个文件http://files.cnblogs.com/files/AIThink/Test01.zip 在Java 8之前,如果想将行为传入函数,仅有的选择就是匿名类,需要6行代码.而定义行为最重要的那行代码,却混在中间不够突出.Lambda表达式取代了匿名类,取消了模板,允许用函数式风格编写代码.这样有时可读性更好,表达更清晰.在Java生态系统中,函数式表达与对面向对象的全面支持是个激动人心的进步.将进一步促进并行第三方库的发展,充分利用多核CPU.尽

Java语言编程学习之Lambda表达式设计和架构的原则[图]

Java语言编程学习之Lambda表达式设计和架构的原则[图]:大家都知道,Lambda表达式是对Java语言的一点简单改进,在JDK标准类库中,运行它的方式各种各样.但是大多数的Java代码都不是由开发JDK的程序猿写的,而是像我们这样的普通程序猿.很多人都会碰到过这样的情况:你实现了一个新功能或修复了一个缺陷,并且对自己的修改很满意.但其他人看了你的代码后--也许发生在代码审查环节,完全不买账!对于什么是好代码,什么是坏代码,存在分歧很正常!设计模式的改变设计模式是人们熟悉的另一种设计思想,

关于JAVA核心技术(卷一)读后的思考(lambda表达式的讨论)

lambda表达式 lambda表达式是一个可传递的代码块.可以以后执行一次或者多次.在程序运行中我们经常会遇到传递代码段的情况,但是我们一般都是先构造一个对象,然后通过对象调用相应的代码块来实现传递代码块的目的,这个方法十分繁琐,设计师为解决这个问题,就设计出了lambda表达式. lambda表达式的语法我们可以参考之前写的方法,可以发现如果方法可以分为方法名,参数和方法主体.lambda表达式就是将方法名省去: 标准情况: (参数类型1 参数1,参数类型2 参数2,.....,参数类型n