lambda表達式解決java后臺分組排序過程解析
需求:按照起始日期查詢出數據庫里一段連續(xù)日期的住院信息。
問題:數據庫里的住院信息可能不是完整的,也就是在給出的日期區(qū)間里只有若干天的數據,缺少某些日期的數據。
解決:
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;
}
下面貼出生成給定起始日期生成連續(xù)日期的代碼:
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())) {
// 根據日歷的規(guī)則,為給定的日歷字段添加或減去指定的時間量
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;
}
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
Spring?AI?+?混元帶你實現企業(yè)級穩(wěn)定可部署的AI業(yè)務智能體
我們深入探討了Spring?AI在智能體構建中的實際應用,特別是在企業(yè)環(huán)境中的價值與效能,通過逐步實現一個本地部署的智能體解決方案,我們不僅展示了Spring?AI的靈活性與易用性,還強調了它在推動AI技術與業(yè)務深度融合方面的潛力,感興趣的朋友一起看看吧2024-11-11
SpringBoot實現elasticsearch索引操作的代碼示例
這篇文章主要給大家介紹了SpringBoot如何實現elasticsearch 索引操作,文中有詳細的代碼示例,感興趣的同學可以參考閱讀下2023-07-07
SpringMVC中的@RequestMapping注解解析
這篇文章主要介紹了SpringMVC中的@RequestMapping注解解析,SpringMVC使用@RequestMapping注解為控制器指定可以處理哪些?URL?請求,在控制器的類定義及方法定義處都可標注@RequestMapping,需要的朋友可以參考下2023-12-12
Java并發(fā)編程之Semaphore(信號量)詳解及實例
這篇文章主要介紹了Java并發(fā)編程之Semaphore(信號量)詳解及實例的相關資料,需要的朋友可以參考下2017-06-06

