【反射+排序接口+泛型】实现排序方法的抽取

1.定义一个father类来限制泛型的上限

class father {
}

2.定义两个子类继承father模拟真实业务中的情况

// 表格一返回值bean
class son1 extends father {
    private String name;
    private Integer level;

    public son1(String name, Integer level) {
        this.name = name;
        this.level = level;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getLevel() {
        return level;
    }

    public void setLevel(Integer level) {
        this.level = level;
    }

    @Override
    public String toString() {
        return "son1{" +
                "name='" + name + '\'' +
                ", level=" + level +
                '}';
    }
}

// 表格二返回值bean
class son2 extends father {
    private String name;
    private Integer level;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getLevel() {
        return level;
    }

    public void setLevel(Integer level) {
        this.level = level;
    }

    @Override
    public String toString() {
        return "son1{" +
                "name='" + name + '\'' +
                ", level=" + level +
                '}';
    }
}

3.利用反射机制写一个根据传入的对象和传入的对象的属性名来获取对应get方法对应值的方法

    public static Object getObject(Object obj, String filedName) {
        Object res = null;
        try {
            String methodName = "get" + filedName.substring(0, 1).toUpperCase(Locale.ROOT) + filedName.substring(1);
            Method method = obj.getClass().getMethod(methodName);
            res = method.invoke(obj);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return res;
    }

4.【关键】定义泛型方法来限制泛型的上限,使我们传入的参数必须继承于father类

参数一:需要排序的集合

参数二:需要参与排序的字段

参数三:需要排序的集合的泛型的class对象

    public static <T extends father> List<T> sort(List<T> list, String filedType, Class<T> clz) {
        List<T> collect = list.stream().map(clz::cast).sorted((o1, o2) -> {
            String s1 = getObject(o1, filedType).toString();
            String s2 = getObject(o2, filedType).toString();
            return s1.compareTo(s2);
        }).collect(Collectors.toList());

        return collect;
    }

5.测试  泛型为son1的集合,根据name字段排序

 public static void main(String[] args) {
        ArrayList<son1> son1s = new ArrayList<>();
        son1 son1 = new son1("abc", 2);
        son1 son2 = new son1("bbb", 1);
        son1s.add(son1);
        son1s.add(son2);
        List<com.bbbs.springcloud.controller.huawei.son1> resultList = sort(son1s, "name", son1.class);
        resultList.forEach(System.out::println);
    }

打印排序后的集合发现已经根据name进行排序

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值