用泛型和反射给List中的数据排序

前言

  • 最近优化项目代码时,发现了很多重复的代码,都是给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());
        });

    }

程序运行结果

这里写图片描述

小结

  • 此排序小工具只是运用特定的数据类型,如果读者想扩展,只能打开工具类再加上适合自己业务的数据类型,不过这样以来不符合开闭原则了,但是这个工具完全满足我们现在以及将来的业务,对于我们这个产品来说,足够用了。

猜你喜欢

转载自blog.csdn.net/u013067402/article/details/80598202