比较器需要实现Comparator,一定要实现compare(T o1,T o2)方法。利用反射原理拿到具体属性的get方法,get到具体的值后进行比较。
public static <T> Comparator<T> getComparator(Class<?> class, String orderBy, String orderType) {
Comparator<T> comparator = null;
if(StringHelper.isNotBlank(orderBy) && StringHelper.isNotBlank(orderType)) {
Method method = ReflectUtil.getMethod(entityClass, true, "get" + orderBy);
if (method == null) {
return null;
}
if (method.getReturnType().equals(Double.class)) {
Comparator<Double> compareTo;
if ("desc".equalsIgnoreCase(orderType)) {
compareTo = Comparator.nullsFirst(Double::compareTo);
} else {
compareTo = Comparator.nullsLast(Double::compareTo);
}
comparator = Comparator.comparing(key -> ReflectUtil.invoke(key, method), compareTo);
} else if (method.getReturnType().equals(Integer.class)) {
Comparator<Integer> compareTo;
if ("desc".equalsIgnoreCase(orderType)) {
compareTo = Comparator.nullsFirst(Integer::compareTo);
} else {
compareTo = Comparator.nullsLast(Integer::compareTo);
}
comparator = Comparator.comparing(key -> ReflectUtil.invoke(key, method), compareTo);
} else if (method.getReturnType().equals(BigDecimal.class)) {
Comparator<BigDecimal> compareTo;
if ("desc".equalsIgnoreCase(orderType)) {
compareTo = Comparator.nullsFirst(BigDecimal::compareTo);
} else {
compareTo = Comparator.nullsLast(BigDecimal::compareTo);
}
comparator = Comparator.comparing(key -> ReflectUtil.invoke(key, method), compareTo);
} else if (method.getReturnType().equals(Date.class)) {
Comparator<Date> compareTo;
if ("desc".equalsIgnoreCase(orderType)) {
compareTo = Comparator.nullsFirst(Date::compareTo);
} else {
compareTo = Comparator.nullsLast(Date::compareTo);
}
comparator = Comparator.comparing(key -> ReflectUtil.invoke(key, method), compareTo);
} else if (method.getReturnType().equals(LocalDate.class)) {
Comparator<LocalDate> compareTo;
if ("desc".equalsIgnoreCase(orderType)) {
compareTo = Comparator.nullsFirst(LocalDate::compareTo);
} else {
compareTo = Comparator.nullsLast(LocalDate::compareTo);
}
comparator = Comparator.comparing(key -> ReflectUtil.invoke(key, method), compareTo);
} else {
Comparator<String> compareTo;
if ("desc".equalsIgnoreCase(orderType)) {
compareTo = Comparator.nullsFirst(String::compareTo);
} else {
compareTo = Comparator.nullsLast(String::compareTo);
}
comparator = Comparator.comparing(key -> ReflectUtil.invoke(key, method), compareTo);
}
if ("desc".equalsIgnoreCase(orderType)) {
comparator = comparator.reversed();
}
}
return comparator;
}
获取到比较器后,List列表可以通过list.sort(comparator)进行排序。
List<Student> list = new ArrayList<>();
//实体集合省略...
Comparator<Student> comparator = ComparatorUtil.getComparator(Student.class, orderBy, orderType);
list.sort(comparator);