java通用实现List<自定义对象>中指定字段和指定排序方式

Person类:

java 复制代码
/**
 * @date 2023/12/19 11:20
 */
public class Person {
    private String name;
    private String sex;

    public Person() {
    }

    public Person(String name, String sex) {
        this.name = name;
        this.sex = sex;
    }

    public String getName() {
        return name;
    }

    public String getSex() {
        return sex;
    }

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

    public void setSex(String sex) {
        this.sex = sex;
    }
}

工具类:

java 复制代码
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.*;

/**
 * @date 2023/12/22 14:30
 */
public class SortListObjUtils {

    public final static String SORT_FIELD_PIX = "get";
    public final static String SORT_METHOD_DESC = "desc";
    public final static String SORT_METHOD_ASC = "asc";

    /**
     * 反射方式
     *
     * @param targetList 目标排序
     * @param sortField  排序字段-实体类属性名,例如: private String name;
     * @param sortMethod 排序方式-asc or desc
     */
    public static <T> void sortObjList(List<T> targetList, final String sortField, final String sortMethod) {
        Collections.sort(targetList, new Comparator() {
            @Override
            public int compare(Object obj1, Object obj2) {
                int retVal = 0;
                try {
                    // 首字母转大写
                    String newString = sortField.substring(0, 1).toUpperCase() + sortField.replaceFirst("\\w", "");
                    // 生成getter方法,例如 getName
                    String methodString = SORT_FIELD_PIX + newString;

                    Method method1 = ((T) obj1).getClass().getMethod(methodString, null);
                    Method method2 = ((T) obj2).getClass().getMethod(methodString, null);
                    if (sortMethod != null && Objects.equals(SORT_METHOD_DESC, sortMethod)) {
                        retVal = method2.invoke(((T) obj2), null).toString().compareTo(method1.invoke(((T) obj1), null).toString()); // 倒序
                    } else {
                        retVal = method1.invoke(((T) obj1), null).toString().compareTo(method2.invoke(((T) obj2), null).toString()); // 正序
                    }
                } catch (Exception e) {
                    throw new RuntimeException();
                }
                return retVal;
            }
        });
    }


    public static void main(String[] args) throws InvocationTargetException, IllegalAccessException, NoSuchMethodException {
        // Person的修饰符一定要是public
        List<Person> personList = new ArrayList<>();
        Person person1 = new Person("1", "m");
        Person person2 = new Person("4", "f");
        Person person3 = new Person("2", "f");
        personList.add(person1);
        personList.add(person2);
        personList.add(person3);

        // 倒序
        long start1 = System.currentTimeMillis();
        SortListObjUtils.sortObjList(personList, "name", SORT_METHOD_DESC);
        long end1 = System.currentTimeMillis();
        System.out.println("倒序方式耗时 " + (end1 - start1) + " 毫秒");
        for (Person person : personList) {
            System.out.println("name->" + person.getName() + "  sex->" + person.getSex());
        }

        // 序序
        long start2 = System.currentTimeMillis();
        SortListObjUtils.sortObjList(personList, "name", SORT_METHOD_ASC);
        long end2 = System.currentTimeMillis();
        System.out.println("升序方式耗时 " + (end2 - start2) + " 毫秒");
        for (Person person : personList) {
            System.out.println("name->" + person.getName() + "  sex->" + person.getSex());
        }
    }
}

结果:

相关推荐
txxzjmzlh15 小时前
SpringBoot 统⼀功能处理
java·spring boot·后端
nice_lcj52017 小时前
Java Lambda 表达式入门:怎么写、怎么用、常用方法有哪些
java·开发语言·后端·面试
码农小河6617 小时前
基于SSM+JSP+MySQL的在线医疗服务系统的设计与实现
java·开发语言·mysql
SL_staff18 小时前
从配置失效到逻辑复用:JVS-Logic 如何构建可治理的业务编排中枢
java·spring·产品
特立独行的猫A18 小时前
一份 Markdown 发十个平台:cspub 一稿多投
java·后端·python
文丑颜不良啊19 小时前
LeetCode1961~1980题目解析
java·leetcode
文丑颜不良啊20 小时前
LeetCode2001~2020题目解析
java·leetcode
用户37215742613520 小时前
Java 批量提取 Word 文档中的图片并保存到本地
java
SL_staff20 小时前
BI项目失败率90%?JVS如何用三阶闭环构建可落地的数据生产力平台
java·开源·全栈
nice_lcj5201 天前
ThreadLocal 入门:它是怎么隔离数据的、为什么会导致内存泄漏
java·开发语言·后端·面试·并发编程·内存泄漏·threadlocal