项目场景:
今天在上工作上,要对一个list进行多级分组,首先通过一个字段分组,再对分组内的list进行单独的时间排序。
问题描述
原因分析:
一开始思考直接在sql层面解决,但发现sql层面只能解决第一层分组的要求,利用FIELD函数进行分组。
ORDER BY FIELD(isFinish,0,1)
所以在进行分组后的list进入业务层进行处理,由于对于stream不太熟悉,参考了这个帖子成功实现。
解决方案:
主要代码:
IPage<VisitVO> result = baseMapper.getPage(page, visitRO); Map<String, List<VisitVO>> map = result.getRecords().stream() .collect(Collectors.groupingBy(VisitVO::getIsFinish)); Map<String, VisitVO> mapone = result.getRecords().stream().collect( Collectors.groupingBy( VisitVO::getIsFinish,Collectors.collectingAndThen( Collectors.reducing((c1, c2) -> c1), Optional::get) ) ); Map<String, VisitVO> linkedHashMap = new LinkedHashMap<>(); mapone.entrySet().stream().sorted( Map.Entry.<String, VisitVO>comparingByValue( Comparator.comparing( VisitVO::getIsFinish ) ) ).forEachOrdered(e -> linkedHashMap.put(e.getKey(), e.getValue())); List<String> finishsort = new ArrayList<String>(linkedHashMap.keySet()); // 根据country列表 获取完整分组、排序、排序类表(每组再根据年龄升序) List<VisitVO> finalPeopleGroupSortList = new ArrayList<>(); for (String isfinish : finishsort) { // 如果未随访,治疗完成时间倒序 if ("0".equals(isfinish)){ List<VisitVO> ageSortGroup = map.get(isfinish).stream().sorted(Comparator.comparing(VisitVO::getTreatmentTime).reversed()).collect(Collectors.toList()); finalPeopleGroupSortList.addAll(ageSortGroup); }// 如果已随访,随访完成时间倒序 else { List<VisitVO> ageSortGroup = map.get(isfinish).stream().sorted(Comparator.comparing(VisitVO::getVisitTime).reversed()).collect(Collectors.toList()); finalPeopleGroupSortList.addAll(ageSortGroup); } }
后续对于stream的groupingBy进行了学习,参考这个帖子 https://blog.csdn.net/u014231523/article/details/102535902写的非常好,还是大佬多呀。