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, ......)