前言
- 最近优化项目代码时,发现了很多重复的代码,都是给List中的数据做排序,有的是按照字符串排序,有的是按照Integer排序,有的是按照日期Date排序,并且,
List
中存放的是不同的value object
,但是这些数据都有一个共同点,那就是里面的数据都有date、orderNum、serial
、字段,例如,TestVo
中就有date、orderNum、serial 等成员变量,OrderVo中也有date、orderNum、serial 成员变量,现在需要将
List`List<orderVo>
中的数据分别按照date
或者orderNum
或者serial
来做排序,结果程序中各自一套,于是自己将这几种排序方式抽成了一个工具类,减少很多冗余代码。
排序的工具类代码
public static <T> List<T> listSortByDate2(List<T> t, final String methodName,final String fieldName) {
Collections.sort(t, new Comparator<Object>() {
@Override
public int compare(Object o1, Object o2) {
try {
Method method = ((T) o1).getClass().getMethod(methodName, null);
Method method1 = ((T) o2).getClass().getMethod(methodName, null);
String typeName = method.invoke(o1, null).getClass().getName();
if ("java.lang.Integer".equals(typeName)){
Integer num1=new Integer(String.valueOf(method.invoke(o1,null)));
Integer num2=new Integer(String.valueOf(method.invoke(o2,null)));
return num1.compareTo(num2);
}else if ("java.util.Date".equals(typeName)){
Date dt1=(Date) method.invoke(o1,null);
Date dt2=(Date) method1.invoke(o2,null);
Long time1=dt1.getTime();
Long time2=dt2.getTime();
return time1.compareTo(time2);
}else if ("java.lang.String".equals(typeName)){
String str1=String.valueOf(method.invoke(o1,null));
String str2=String.valueOf(method.invoke(o2,null));
return str1.compareTo(str2);
}
}catch (Exception e){
e.printStackTrace();
}
return 0;
}
});
return t;
}
TestVo
public class TestVo {
private Integer orderNum;
private Date date;
private String serial;
public String getSerial() {
return serial;
}
public void setSerial(String serial) {
this.serial = serial;
}
public Integer getOrderNum() {
return orderNum;
}
public void setOrderNum(Integer orderNum) {
this.orderNum = orderNum;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
}
构造测试数据
public static List<TestVo> packageData(){
List<TestVo> list=new ArrayList<>();
Date date1=new Date();
Date date2=new Date(1528190706992L-1000*60*60*24*4L);
Date date3=new Date(1528190706992L+1000*60*60*24*5L);
Date date4=new Date(1528190706992L+1000*60*60*24*10L);
TestVo t1=new TestVo();
t1.setDate(date1);
t1.setOrderNum(2);
t1.setSerial("00115");
list.add(t1);
TestVo t2=new TestVo();
t2.setDate(date2);
t2.setOrderNum(5);
t2.setSerial("00112");
list.add(t2);
TestVo t3=new TestVo();
t3.setDate(date4);
t3.setOrderNum(3);
t3.setSerial("00212");
list.add(t3);
TestVo t4=new TestVo();
t4.setDate(date3);
t4.setOrderNum(4);
t4.setSerial("00211");
list.add(t4);
return list;
}
测试程序运行
public static void main(String[] args) {
List<TestVo> list = packageData()
List<TestVo> strResult = listSortByDate2(list, "getSerial","fastTime")
System.out.println("按照String:serial 排序结果")
strResult.forEach(x->{
System.out.println(x.getSerial())
})
System.out.println("-------------------------------------------------------------------")
List<TestVo> intResult = listSortByDate2(list, "getOrderNum","fastTime")
System.out.println("按照Integer:orderNum 排序结果")
intResult.forEach(x->{
System.out.println(x.getOrderNum())
})
System.out.println("-------------------------------------------------------------------")
List<TestVo> dateResult = listSortByDate2(list, "getDate","fastTime")
System.out.println("按照Date:date 排序结果")
dateResult.forEach(x->{
System.out.println(x.getDate().toString())
})
}
程序运行结果
小结
- 此排序小工具只是运用特定的数据类型,如果读者想扩展,只能打开工具类再加上适合自己业务的数据类型,不过这样以来不符合开闭原则了,但是这个工具完全满足我们现在以及将来的业务,对于我们这个产品来说,足够用了。