在Java中如何给List进行排序?这7种方法都可以轻松实现!
在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);
}
}
打印结果:
如上代码所示,成功使用Collections.sort()
方法将学生列表根据年龄排好序了。
方法二
在Java8中,可以利用lambda表达式进行排序:
// 方法二:Java8中使用lambda表达式
Collections.sort(studentList, (student1, student2) -> student1.getClassName().compareTo(student2.getClassName()));
打印结果:
如上代码所示,成功使用Collections.sort(studentList, (student1, student2) -> student1.getClassName().compareTo(student2.getClassName()));
lambda表达式将学生列表根据班级排好序了。
方法三
可以使用类型推断增强lambda表达式,代码如下:
// 方法三:通过类型推断增强lambda表达式
Collections.sort(studentList, (student1, student2) -> student1.getAge() - student2.getAge());
打印结果:
如上代码所示,通过类型推断增强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);
打印结果:
如上代码,我们先是在Student类中增加了compareByAge的静态方法,然后结合lambda表达式成功进行了排序。
方法五
可以通过Comaprator的comparing()方法进行排序:
// 方法五:通过使用Comaprator的comparing()方法
Collections.sort(studentList, Comparator.comparing(Student::getAge));
打印结果:
如上代码,我们通过Comaprator的comparing()方法成功进行了排序。
方法六
可以通过以下代码实现倒叙排序:
// 方法六:lambda倒叙
Comparator<Student> compare = (student1, student2) -> student1.getAge() - student2.getAge();
Collections.sort(studentList, compare.reversed());
打印结果:
可以看到,我们成功的通过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());
}
});
打印结果:
可以看出,不管条件多么多,只要使用lambda表达式,结合if表达式灵活实现了列表多条件的排序功能。
总结
以上我介绍了7种列表排序的方法,在 Java 8 之前,我们使用 for-each 循环遍历 List 并打印列表的每个内容,Java 8以后就可以使用forEach() 方法对于lambdas的应用非常实用。
从文中介绍的排序方法,可以看出在 Java 8 中使用 lambda 表达式对列表进行排序会使得代码简洁且富有表现力,希望大家在遇到排序场景的时候,多使用lambda 表达式。
最后感谢您的阅读,希望本文对您有所帮助,有任何问题都可以在下方评论区与我讨论!
- 点赞
- 收藏
- 关注作者
评论(0)