利用泛型和反射对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.运行结果

在这里插入图片描述

### 使用 `CglibUtil.copyList` 方法传递 `Long` 参数 为了在 `CglibUtil.copyList` 方法中使用 `Long` 类作为参数,可以按照如下方式操作: 假设有一个源列表 `sourceList` 目标类为 `Long` 的目标列表 `targetList`。 ```java import java.util.List; import net.sf.cglib.beans.BeanCopier; public class Example { public static void main(String[] args) { List<SourceObject> sourceList = ...; // 初始化源列表 // 创建目标列表 List<Long> targetList = new ArrayList<>(); // 假设 SourceObject 中有 getId() 返回 long 或 Long 类的方法 for (SourceObject source : sourceList) { Long idValue = source.getId(); // 获取源对象中的属性值 // 将转换后的值添加到目标列表 targetList.add(idValue); } // 如果 CglibUtil 提供了更简便的方式,则可以直接调用 copyList 并指定参数 // 下面是一个假定存在的实现形式 @SuppressWarnings("unchecked") List<Long> copiedList = CglibUtil.<Long>copyList(sourceList, Long.class); } } ``` 需要注意的是,在实际应用中如果 `CglibUtil.copyList` 支持直接复制带有特定字段的对象至新集合时,通常会涉及到两个不同类的对象之间的拷贝。对于简单的基本数据类如 `Long`,可能并不需要复杂的 BeanBean 的映射逻辑[^1]。 当处理复杂对象间的属性复制时,CGlib 工具库提供了诸如 `BeanCopier` 这样的功能用于高效地完成这项工作;但对于简单场景下的类转换或提取某些特定字段形成新的集合来说,上述代码片段展示了如何手动构建这过程并利用 Java 机制确保类安全。 #### 关于 `CglibUtil.copyList` 是否支持直接传入 `Long` 参数的具体行为取决于该工具类的设计与实现细节。如果没有现成的支持,开发者可以根据需求自定义适配器或者遵循类似的模式来达到目的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值