Java8使用Comparator.comparing根据不同状态进行自定义排序

Java8使用Comparator.comparing根据不同状态进行自定义排序

场景:对字符串格式的不同“状态”进行排序,一开始想到使用SQL语句的order by if排序,如果是使用mybatis操作数据库的话是没有问题的,直接可以在SQL上进行排序。但是我用的是公司自己封装的数据库,使用order by if 有些会导致SQL查询排序是OK的,但是返回的json并没有排序,那如何对返回的数据进行排序呢?

为了解决这个问题,也查了很多资料,大多数是使用年龄、分数或者名字字母进行排序,并没有我想要的根据不同状态的字符串形式来自定义排序。最后,也是找到了某位博主的文章解决了这个问题,文章地址如下:https://blog.csdn.net/zjy15203167987/article/details/88246482

  • 在SQL中使用order by if()排序是没问题的,但是返回的json数据就没有进行排序。
select * where 1 = 1 order by 
if (exec_status='执行中', 0, 1),
if (exec_status='待执行', 0, 2), 
if (exec_status='待审核', 0, 3), 
if (exec_status='未到期', 0, 4), 
if (exec_status='已审核', 0, 5), 
if (exec_status='已过期', 0, 6)
  • 在Java代码中使用Comparator.comparing进行自定义排序,传入原有未排序数据,返回已排序数据。
/**
* 说明:
* workOrders     排序前原有数据
* workOrderList  排序后最终数据
* statusList     排序状态顺序
*/
private List<WorkOrder> getListSort(List<WorkOrder> workOrders) {
        List<WorkOrder> workOrderList = new ArrayList<>(); //用来存放新的排好序的数据
        //状态排序顺序
        List<String> statusList = Arrays.asList("执行中", "待执行", "待审核", "未到期", "已审核", "已过期");
        workOrders.stream().sorted(
                Comparator.comparing(WorkOrder::getExecStatus, (x, y) -> {
                    if (x == null && y != null) {
                        return 1;
                    } else if (x != null && y == null) {
                        return -1;
                    } else if (x == null) {
                        return -1;
                    } else {
                        //按照读取的statusList顺序排序
                        for (String sort : statusList) {
                            if (sort.equals(x) || sort.equals(y)) {
                                if (x.equals(y)) {
                                    return 0;
                                } else if (sort.equals(x)) {
                                    return -1;
                                } else {
                                    return 1;
                                }
                            }
                        }
                        return 0;
                    }
                    //先状态排序,状态相同就按照创建时间降序排序
                }).thenComparing(Comparator.comparing(WorkOrder::getExecStatus)
                        .thenComparing(Comparator.comparing(WorkOrder::getCreateTime).reversed())) //reversed降序
        ).collect(Collectors.toList()).forEach(x -> {
            WorkOrder w = new WorkOrder();
            BeanUtil.copyProperties(x, w);
            workOrderList.add(w); //将排好序的数据保存到workOrderList中
        });
        workOrderList.forEach(System.out::println); //遍历输出数据
        return workOrderList;
    }
  • 测试输出的数据如下,正好是自己想要的顺序结果:
WorkOrder(id=956126093242580992, name=测试-执行中-20220323, planId=956126067653132288, planName=测试-执行中, execStatus=执行中, createTime=Wed Mar 23 09:43:44 CST 2022, ......)
WorkOrder(id=956125918088445952, name=测试-待执行-20220323, planId=956125881757384704, planName=测试-待执行, execStatus=待执行, createTime=Wed Mar 23 09:43:02 CST 2022, ......)
WorkOrder(id=956125708180307968, name=测试-已过期-20220323, planId=956125680980246528, planName=测试-已过期, execStatus=待执行, createTime=Wed Mar 23 09:42:12 CST 2022, ......)
WorkOrder(id=956126393881903104, name=测试-待审核-20220323, planId=956126369114537984, planName=测试-待审核, execStatus=待审核, createTime=Wed Mar 23 09:44:56 CST 2022, ......)
WorkOrder(id=956125340469870592, name=测试-未到期-20220326, planId=956125285717426176, planName=测试-未到期, execStatus=未到期, createTime=Wed Mar 23 09:40:45 CST 2022, ......)
WorkOrder(id=956126638913142784, name=测试-已审核-20220323, planId=956126615492149248, planName=测试-已审核, execStatus=已审核, createTime=Wed Mar 23 09:45:54 CST 2022, ......)
  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值