stream中的Collectors.groupingBy用法学习

本文介绍了在工作中遇到的对list进行多级分组和排序的问题。首先尝试在SQL层面解决,但发现只能完成一级分组。然后在业务层使用Java的StreamAPI,通过groupingBy和收集器来实现分组和排序。文章详细展示了如何通过stream处理数据,包括分组、排序以及构建有序映射,最后将结果转换为所需列表。
摘要由CSDN通过智能技术生成

项目场景:

今天在上工作上,要对一个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写的非常好,还是大佬多呀。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值