集合排序工具类封装(注解方式):
1.首先,创建一个注解类,用于标记排序字段:
package com.qiang.util;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* @Author qiang
* 2018年10月29日10:52:13
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface SortField {
//排序方式 默认:正序
boolean value() default false;
}
2.创建一个排序工具类:用于集合排序:
package com.qiang.util;
import com.qiang.util.ExceptionUtils;
import lombok.extern.slf4j.Slf4j;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Collections;
import java.util.List;
/**集合排序工具类
* 使用须知:
* 1.将@SortField注解加载需要排序的实体类上
* 2.调用本工具类排序
* @author qiang
*/
@Slf4j
public class ListSortUtil<T> {
/*排序字段的getter方法*/
private Method sortMethod;
/**排序方式 默认:正序*/
private boolean sortMode=true;
public ListSortUtil(Class clazz){
//SortField注解扫描,确定排序字段。
Field[] fields=clazz.getDeclaredFields();
outer:
for(Field f:fields){
Annotation[] annotations=f.getDeclaredAnnotations();
for(Annotation a:annotations){
if(a instanceof SortField){
this.sortMode=((SortField) a).value();
String getterName="get" + f.getName().substring(0, 1).toUpperCase() + f.getName().substring(1);
try {
this.sortMethod=clazz.getMethod(getterName,null);
} catch (NoSuchMethodException e) {
log.error("排序字段没有getter方法");
break outer;
}
break outer;
}
}
}
}
/**
* @param list
*/
public void sort(List<T> list){
Collections.sort(list, (T t1,T t2)->{
try {
if(sortMethod==null){
log.error("排序失败");
return 0;
}
if (sortMode) {
return sortMethod.invoke(t1).toString().compareTo(sortMethod.invoke(t2).toString());
}else{
return sortMethod.invoke(t2).toString().compareTo(sortMethod.invoke(t1).toString());
}
} catch (IllegalAccessException e) {
log.error("排序失败:"+ ExceptionUtils.exceptionStackTraceAsString(e));
} catch (InvocationTargetException e) {
log.error("排序失败:"+ ExceptionUtils.exceptionStackTraceAsString(e));
}
return 0;
});
}
}
3.工具类使用:
首先,在实体类中要排序的字段上加上我们写好的自定义注解@SortField:
注意: 如果要倒序,注解中传false如:@SortField(value = false)
@SortField(value = true)
private Long msgId;
然后直接使用工具类排序:
//创建一个排序工具类对象
ListSortUtil<ChatMessageVo> listSortUtil=new ListSortUtil(ChatMessageVo.class);
//调用排序方法排序
listSortUtil.sort(list);
over~