Java开发中List排序的7种方法详解

wljslmz 2025-01-02 08:12:02编程技术
831

在Java开发过程中,对集合中的元素进行排序是一项常见的操作。特别是在处理大量数据时,高效的排序算法能够显著提升程序性能。随着Java8的发布,引入了Lambda表达式和方法引用,使得排序操作变得更加简洁和直观。本文将详细介绍在Java中对List进行排序的7种方法,从传统的Collections.sort()到现代的Lambda表达式和方法引用,帮助开发者掌握各种排序技巧,提高编程效率。

前言

在Java中我们经常需要对 ArrayList、LinkedList 或 CopyOnWriteArrayList 等列表进行排序,在Java8出现之前,排序虽然能够实现,但是代码写起来不是很优雅,而且性能上也没有什么优势。Java 8 及其以后之后,引入了 Lambda 表达式和方法引用,可以根据不同的条件以不同的顺序对对象列表进行排序,Comparator API 的增强功能也使 Java 中的对象比较和排序变得更加容易。

在本文,我将介绍如何使用 Lambda 表达式和方法引用对 ArrayList 等 List 进行排序,我将介绍7种方法,下面就直接进入代码实战。

在开始介绍前,我们先新建一个学生类Student类,作为List中的对象:

Student:

package com.test.javaroads.java8sort;
import lombok.Data;
/**
 * @author: javaroads
 * @date: 2022/11/22 22:06
 * @description: 学生类
 */
@Data
@AllArgsConstructor
public class Student {
    /**
     * 学生ID
     */
    private String sid;
    /**
     * 学生姓名
     */
    private String name;
    /**
     * 学生年龄
     */
    private Integer age;
    /**
     * 性别
     */
    private String gender;
    /**
     * 所属班级
     */
    private String className;
}

如上代码,新建了Stdent类,属性有:学生ID(sid)、学生姓名(name)、学生年龄(age)、性别(gender)、所属班级(className)。

方法一

在Java8之前,没有lambda表达式,一般都是java.util包中的Collections.sort()方法,代码如下:

package com.test.javaroads.java8sort;

import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @author: javaroads
 * @date: 2022/11/22 22:12
 * @description: 排序方法
 */
public class Sort {

    public static void main(String[] args) {
        List<Student> studentList = Arrays.asList(
                new Student("s1", "小李", 18, "女", "一班"),
                new Student("s2", "小王", 20, "男", "三班"),
                new Student("s3", "小张", 19, "男", "四班"),
                new Student("s4", "小汪", 19, "男", "二班"));

        System.out.println("排序前");
        studentList.forEach(System.out::println);

        // 方法一:Java8之前,不用lambda表达式
        Collections.sort(studentList, new Comparator<Student>() {
            @Override
            public int compare(Student student1, Student student2) {
                return student1.getAge() - student2.getAge();
            }
        });

        // 用forEach打印出排序后的list
        System.out.println("排序后的list:");
        studentList.forEach(System.out::println);
    }
}

打印结果:

Java开发中List排序的7种方法详解

如上代码所示,成功使用Collections.sort()方法将学生列表根据年龄排好序了。

方法二

在Java8中,可以利用lambda表达式进行排序:

// 方法二:Java8中使用lambda表达式
Collections.sort(studentList, (student1, student2) -> student1.getClassName().compareTo(student2.getClassName()));

打印结果:

Java开发中List排序的7种方法详解

如上代码所示,成功使用Collections.sort(studentList, (student1, student2) -> student1.getClassName().compareTo(student2.getClassName()));lambda表达式将学生列表根据班级排好序了。

方法三

可以使用类型推断增强lambda表达式,代码如下:

// 方法三:通过类型推断增强lambda表达式
Collections.sort(studentList, (student1, student2) -> student1.getAge() - student2.getAge());

打印结果:

Java开发中List排序的7种方法详解

如上代码所示,通过类型推断增强lambda表达式将学生列表根据学生年龄排好序了。

方法四

可以通过lambda表达式结合静态方法引用进行排序,所以需要在Student中增加静态方法:

/**
 * 根据年龄对学生进行排序
 *
 * @param student1 学生1
 * @param student2 学生2
 * @return 数字
 */
public static int compareByAge(Student student1, Student student2) {
    return student1.getAge().compareTo(student2.getAge());
}
// 方法四:通过lambda表达式结合静态方法引用
Collections.sort(studentList, Student::compareByAge);

打印结果:

Java开发中List排序的7种方法详解

如上代码,我们先是在Student类中增加了compareByAge的静态方法,然后结合lambda表达式成功进行了排序。

方法五

可以通过Comaprator的comparing()方法进行排序:

// 方法五:通过使用Comaprator的comparing()方法
Collections.sort(studentList, Comparator.comparing(Student::getAge));

打印结果:

Java开发中List排序的7种方法详解

如上代码,我们通过Comaprator的comparing()方法成功进行了排序。

方法六

可以通过以下代码实现倒叙排序:

// 方法六:lambda倒叙
Comparator<Student> compare = (student1, student2) -> student1.getAge() - student2.getAge();
Collections.sort(studentList, compare.reversed());

打印结果:

Java开发中List排序的7种方法详解

可以看到,我们成功的通过reversed()方法实现了倒序排序。

方法七

当排序条件非常多的时候应该怎么做?要善于使用lambda表达式:

// 方法七:多条件排序
Collections.sort(studentList, (student1, student2) -> {
    if (student1.getGender().equals(student2.getGender())) {
        return student1.getAge() - student2.getAge();
    } else {
        return student1.getClassName().compareTo(student2.getClassName());
    }
});

打印结果:

Java开发中List排序的7种方法详解

可以看出,不管条件多么多,只要使用lambda表达式,结合if表达式灵活实现了列表多条件的排序功能。

总结

通过对Java中List排序的7种方法的详细讲解,我们可以看到,Java8引入的Lambda表达式和方法引用极大地简化了排序操作。无论是单条件排序还是多条件排序,都可以通过简洁的代码实现。这些方法不仅提高了代码的可读性,还增强了程序的灵活性和扩展性。掌握这些排序技巧,将有助于开发者在实际项目中更高效地处理数据,提升整体开发效率。希望本文的内容能为广大Java开发者提供有价值的参考和帮助。

java list排序
THE END
蜜芽
故事不长,也不难讲,四字概括,毫无意义。

相关推荐

Java日志管理框架:Log4j、SLF4J、Logback对比与使用方法详解
java主流日志框架中,Log4j 1.x作为早期标准,Log4j 2.x通过重构实现性能飞跃,Logback作为Log4j的继承者以原生SLF4J支持成为主流选择,而SLF4J作为日志门面,通过抽象层实现...
2025-09-15 编程技术
552

Java 与 MySQL 性能优化:MySQL全文检索查询优化实践
本文聚焦Java与MySQL协同环境下的全文检索优化实践,从索引策略、查询调优、参数配置到Java层优化,深入解析如何释放全文检索的潜力,为高并发、大数据量场景提供稳定高效的搜...
2025-09-13 编程技术
535

JavaScript 中 instanceof 的作用及使用方法详解
在 JavaScript 的类型检查体系中,instanceof 是一个重要的操作符,用于判断一个对象是否属于某个构造函数的实例或其原型链上的类型。本文ZHANID工具网将系统讲解 instanceof...
2025-09-11 编程技术
524

Java与MySQL数据库连接实战:JDBC使用教程
JDBC(Java Database Connectivity)作为Java标准API,为开发者提供了统一的数据访问接口,使得Java程序能够无缝连接各类关系型数据库。本文ZHANID工具网将以MySQL数据库为例...
2025-09-11 编程技术
512

JavaScript出现“undefined is not a function”错误的解决方法
在JavaScript开发中,TypeError: undefined is not a function 是最常见的运行时错误之一,通常表示代码尝试调用一个未定义(undefined)的值作为函数。本文ZHANID工具网将从...
2025-09-10 编程技术
536

Java集合框架:List、Set、Map的使用与区别详解
Java集合框架是JDK中提供的核心数据结构库,为开发者提供了高效、安全、可扩展的集合操作能力。本文ZHANID工具网将系统解析List、Set、Map三大核心接口的实现类及其使用场景,...
2025-09-09 编程技术
492