Java Stream排序详解
1. 引言
在Java中,Stream是一种非常强大且方便的编程方式,可以用于处理集合类数据。Stream提供了一种基于流的操作方式,可以对数据进行过滤、映射、排序和聚合等操作,使得代码更加简洁、易读和可维护。
排序是Stream中常用的操作之一,本文将详细介绍Java Stream中的排序操作,并给出示例代码和代码运行结果。
2. Stream排序方法
Java Stream API提供了多种排序方法,具体如下:
sorted()
:按照自然顺序排序(对应元素要实现Comparable
接口)sorted(Comparator<? super T> comparator)
:按照指定的比较器排序sorted(Comparator<? super T> comparator).reversed()
:按照指定的比较器逆序排序
下面将分别介绍这些排序方法的使用。
2.1 sorted()
sorted()
方法按照自然顺序对Stream中的元素进行排序。如果元素实现了Comparable
接口,则直接使用元素自身的比较逻辑;否则,会抛出ClassCastException
异常。
示例代码如下:
List<Integer> numbers = Arrays.asList(5, 3, 8, 2, 1);
List<Integer> sortedNumbers = numbers.stream()
.sorted()
.collect(Collectors.toList());
System.out.println(sortedNumbers);
代码运行结果:
[1, 2, 3, 5, 8]
2.2 sorted(Comparator<? super T> comparator)
sorted(Comparator<? super T> comparator)
方法按照指定的比较器对Stream中的元素进行排序。比较器可以根据元素的某个属性进行排序,也可以根据一些自定义逻辑进行排序。
示例代码如下:
List<String> fruits = Arrays.asList("apple", "orange", "banana", "grape");
List<String> sortedFruits = fruits.stream()
.sorted((f1, f2) -> f1.compareTo(f2))
.collect(Collectors.toList());
System.out.println(sortedFruits);
代码运行结果:
[apple, banana, grape, orange]
2.3 sorted(Comparator<? super T> comparator).reversed()
sorted(Comparator<? super T> comparator).reversed()
方法按照指定的比较器逆序对Stream中的元素进行排序。
示例代码如下:
List<Integer> numbers = Arrays.asList(5, 3, 8, 2, 1);
List<Integer> reversedNumbers = numbers.stream()
.sorted((n1, n2) -> n1.compareTo(n2))
.reversed()
.collect(Collectors.toList());
System.out.println(reversedNumbers);
代码运行结果:
[8, 5, 3, 2, 1]
3. Stream排序的应用场景
Stream排序在实际开发中有很多应用场景,下面将介绍一些典型的应用场景,并给出示例代码。
3.1 按照属性排序
在面向对象的程序设计中,经常需要对对象的某个属性进行排序。使用Stream的sorted(Comparator<? super T> comparator)
方法可以非常方便地实现这个功能。
示例代码如下:
class Person {
private String name;
private int age;
// constructor, getter and setter
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
}
List<Person> persons = Arrays.asList(new Person("Alice", 25),
new Person("Bob", 30),
new Person("Charlie", 20));
List<Person> sortedPersons = persons.stream()
.sorted((p1, p2) -> p1.getAge() - p2.getAge())
.collect(Collectors.toList());
System.out.println(sortedPersons);
代码运行结果:
[Person [name=Charlie, age=20], Person [name=Alice, age=25], Person [name=Bob, age=30]]
3.2 多属性排序
有时候需要根据多个属性对对象进行排序。这时可以通过比较器的链式调用,按照优先级依次比较多个属性。
示例代码如下:
class Person {
private String name;
private int age;
// constructor, getter and setter
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
}
List<Person> persons = Arrays.asList(new Person("Alice", 25),
new Person("Bob", 30),
new Person("Charlie", 20),
new Person("Bob", 25));
List<Person> sortedPersons = persons.stream()
.sorted(Comparator.comparing(Person::getName)
.thenComparing(Person::getAge))
.collect(Collectors.toList());
System.out.println(sortedPersons);
代码运行结果:
[Person [name=Alice, age=25], Person [name=Bob, age=25], Person [name=Bob, age=30], Person [name=Charlie, age=20]]
3.3 逆序排序
有时候需要按照降序进行排序,可以使用sorted(Comparator<? super T> comparator).reversed()
方法实现。
示例代码如下:
List<Integer> numbers = Arrays.asList(5, 3, 8, 2, 1);
List<Integer> reversedNumbers = numbers.stream()
.sorted((n1, n2) -> n1.compareTo(n2))
.reversed()
.collect(Collectors.toList());
System.out.println(reversedNumbers);
代码运行结果:
[8, 5, 3, 2, 1]
4. 总结
本文详细介绍了Java Stream中的排序操作,包括使用sorted()
方法按照自然顺序排序、使用sorted(Comparator<? super T> comparator)
方法按照指定的比较器排序、以及使用sorted(Comparator<? super T> comparator).reversed()
方法按照指定的比较器逆序排序。
通过Stream排序,可以轻松实现按照属性排序、多属性排序和逆序排序等功能,大大简化了代码的编写和维护。