利用泛型和反射对list进行排序(根据list中bean的某一属性值)

list排序==>根据list中bean的某一属性进行排序,抽取公共方法

1.定义实体类

1.User

package entity;

/**
 * @Date 2021/12/10 14:36
 * @Created by wys
 */

public class User {

    private Integer userId;

    private String userName;

    private String password;

    private String score;

    public User(Integer userId, String userName, String password, String score) {
        this.userId = userId;
        this.userName = userName;
        this.password = password;
        this.score = score;
    }

    public User(Integer userId, String userName, String password) {
        this.userId = userId;
        this.userName = userName;
        this.password = password;
    }

    public User() {
    }

    public Integer getUserId() {
        return userId;
    }

    public void setUserId(Integer userId) {
        this.userId = userId;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getScore() {
        return score;
    }

    public void setScore(String score) {
        this.score = score;
    }

    @Override
    public String toString() {
        return "User{" +
                "userId=" + userId +
                ", userName='" + userName + '\'' +
                ", password='" + password + '\'' +
                ", score='" + score + '\'' +
                '}';
    }
}

2.Tester

package entity;

/**
 * @Date 2021/12/16 16:40
 * @Created by wys
 */
public class Tester {

    private Integer testId;

    private String money;

    public Integer getTestId() {
        return testId;
    }

    public void setTestId(Integer testId) {
        this.testId = testId;
    }

    public String getMoney() {
        return money;
    }

    public void setMoney(String money) {
        this.money = money;
    }

    @Override
    public String toString() {
        return "Tester{" +
                "testId=" + testId +
                ", money='" + money + '\'' +
                '}';
    }

    public Tester(Integer testId, String money) {
        this.testId = testId;
        this.money = money;
    }

    public Tester() {
    }

    public Tester(Integer testId) {
        this.testId = testId;
    }
}

2.main方法

package anydemo;

import entity.Tester;
import entity.User;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;

/**
 * @Date 2021/12/16 15:29
 * @Created by wys
 */
public class ListSortDemo {

    public static void main(String[] args) {
        User u1 = new User(1, "1", "1", "111");
        User u2 = new User(2, "1", "1", "1111");
        User u3 = new User(3, "1", "1", "112");
        User u4 = new User(4, "1", "1", "1");
        User u5 = new User(5, "1", "1");
        User u6 = new User(6, "1", "1", "");

        Tester t1 = new Tester(1, "2000");
        Tester t2 = new Tester(2, "1111112");
        Tester t3 = new Tester(3);
        Tester t4 = new Tester(4);
        Tester t5 = new Tester(5, "2023");
        Tester t6 = new Tester(6, "");

        List<User> list = new ArrayList<>();
        list.add(u1);
        list.add(u2);
        list.add(u3);
        list.add(u4);
        list.add(u5);
        list.add(u6);

        List<Tester> testerList = new ArrayList<>();
        testerList.add(t1);
        testerList.add(t2);
        testerList.add(t3);
        testerList.add(t4);
        testerList.add(t5);
        testerList.add(t6);

        System.out.println(Arrays.toString(list.toArray()));
        listSort(list, "score");
        System.out.println(Arrays.toString(list.toArray()));

        System.out.println(Arrays.toString(testerList.toArray()));
        listSort(testerList, "money");
        System.out.println(Arrays.toString(testerList.toArray()));

    }

    public static <V> void listSort(List<V> vList, String keyName) {
        // 传入不同list进行相同逻辑的排序,注意判空(忽略)
        vList.sort(((o1, o2) -> Double.compare(Double.parseDouble(Objects.requireNonNull(getValue(o2, keyName))),Double.parseDouble(Objects.requireNonNull(getValue(o1, keyName))))));
    }

    /**
     * 反射获取bean中的值
     * @return
     */
    public static String getValue(Object obj, String keyName) {
        String value;
        for (Field fieldElem : obj.getClass().getDeclaredFields()) {
            fieldElem.setAccessible(true);
            if (fieldElem.getName().equals(keyName)) {
                Method method = null;
                try {
                    // 获取get方法
                    method = obj.getClass().getMethod("get" + change(keyName), null);
                    value = (String) method.invoke(obj);
                    // 如果为空,直接置最小值
                    return isNotEmpty(value) ? value : String.valueOf(Integer.MIN_VALUE);
                } catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) {
                    e.printStackTrace();
                }
            }
        }
        return String.valueOf(Integer.MIN_VALUE);
    }

    /**
     * @param src 源字符串
     * @return 字符串,将src的第一个字母转换为大写,src为空时返回null
     */
    public static String change(String src) {
        if (src != null) {
            StringBuilder sb = new StringBuilder(src);
            sb.setCharAt(0, Character.toUpperCase(sb.charAt(0)));
            return sb.toString();
        } else {
            return null;
        }
    }

    public static boolean isNotEmpty (String s) {
        if (s != null && !s.equals("")) {
            return true;
        }
        return false;
    }

}

3.运行结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值