一、排序方法
Java 8 Stream提供了sorted()
方法用于排序,该方法可以配合lambda表达式实现比较器Comparator
的功能。在Java 8之前,需要实现Comparator
接口的compare()
方法才能进行排序,而现在可以使用lambda表达式极大地简化了代码。下面是一个简单的例子:
List<Integer> list = Arrays.asList(5, 3, 1, 4, 2);
list.stream()
.sorted((a, b) -> a.compareTo(b))
.forEach(System.out::println);
上述代码使用了lambda表达式进行比较,输出结果为:1, 2, 3, 4, 5。
二、方法链排序
Java 8 Stream提供了多个方法可以进行链式排序,如sorted()
、distinct()
、limit()
和skip()
等,下面是一个排序和去重的例子:
List<Integer> list = Arrays.asList(5, 3, 1, 4, 2, 3);
list.stream()
.sorted()
.distinct()
.forEach(System.out::println);
输出结果为:1, 2, 3, 4, 5。使用方法链可以将多个操作组合在一起,代码可读性更好。
三、对象排序
Java 8 Stream可以对对象进行排序,需要实现Comparable
接口或者自定义比较器Comparator
,并将其作为sorted()
方法的参数传递进去。下面是一个对象排序的例子:
class Student implements Comparable<Student> {
private int id;
private String name;
private int age;
public Student(int id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
public int getId() {
return id;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
@Override
public int compareTo(Student other) {
return Integer.compare(this.getId(), other.getId());
}
}
List<Student> list = Arrays.asList(
new Student(2, "Tom", 20),
new Student(1, "Jack", 22),
new Student(3, "Peter", 18)
);
list.stream()
.sorted()
.forEach(s -> System.out.println(s.getName()));
上述代码中,Student
类实现了Comparable
接口,并且重写了compareTo()
方法实现按照id排序。输出结果为:Jack, Tom, Peter。
四、反向排序
Java 8 Stream提供了方法reversed()
用于对排序方式进行反向排序,下面是一个反向排序的例子:
List<Integer> list = Arrays.asList(5, 3, 1, 4, 2);
list.stream()
.sorted(Comparator.reverseOrder())
.forEach(System.out::println);
输出结果为:5, 4, 3, 2, 1。
五、多条件排序
Java 8 Stream可以使用多个比较器进行排序操作,下面是一个按照年龄和姓名进行排序的例子:
List<Student> list = Arrays.asList(
new Student(1, "Tom", 20),
new Student(2, "Jack", 22),
new Student(3, "Peter", 18),
new Student(4, "Tom", 25),
new Student(5, "Jack", 18)
);
list.stream()
.sorted(Comparator.comparing(Student::getAge)
.thenComparing(Student::getName))
.forEach(s -> System.out.println(s.getName() + ": " + s.getAge()));
上述代码中,排序使用了比较器Comparator.comparing()
和thenComparing()
方法,输出结果为:Jack: 18, Peter: 18, Tom: 20, Jack: 22, Tom: 25。