业务逻辑中,经常出现列表页要按照某字段进行排序的情况,我们可以通过匹配实体字段一个个去写排序逻辑,也可以通过反射机制去实现排序。通过反射去排序,代码很少就能实现。具体样例如下:
假如用一个类型为BigDecimal的字段数值排序,或者非数字排序
private void sortIterationList(OrderDTO listDTO, List<OrderVO> resultList) {
if (StringUtils.isNotBlank(listDTO.getField())) {
String field = listDTO.getField();
if (StrUtil.equalsIgnoreCase(SortValueEnum.ASC.getOrderValue(), listDTO.getOrder())) {
resultList.sort(new Comparator<OrderVO>() {
@SneakyThrows
@Override
public int compare(OrderVO o1, OrderVO o2) {
Field field1 = o1.getClass().getDeclaredField(field);
field1.setAccessible(true);
Field field2 = o2.getClass().getDeclaredField(field);
field2.setAccessible(true);
if(ObjectUtil.isNotNull(field1.get(o1))){
if(NumberUtil.isNumber(String.valueOf(field1.get(o1)))){
return (new BigDecimal(String.valueOf(field1.get(o1))) ).compareTo(new BigDecimal(String.valueOf(field2.get(o2))) );
}else {
return String.valueOf(field1.get(o1)).compareTo(String.valueOf(field2.get(o2)));
}
}else {
return 0;
}
}
});
} else {
//降序
resultList.sort(new Comparator<OrderVO>() {
@SneakyThrows
@Override
public int compare(OrderVO o1, OrderVO o2) {
Field field1 = o1.getClass().getDeclaredField(field);
field1.setAccessible(true);
Field field2 = o2.getClass().getDeclaredField(field);
field2.setAccessible(true);
if(ObjectUtil.isNotNull(field2.get(o2))){
if(NumberUtil.isNumber(String.valueOf(field2.get(o2)))){
return (new BigDecimal(String.valueOf(field2.get(o2))) ).compareTo(new BigDecimal(String.valueOf(field1.get(o1))) );
}else {
return String.valueOf(field2.get(o2)).compareTo(String.valueOf(field1.get(o1)));
}
}else {
return 0;
}
}
});
}
}
}