Java Stream排序详解

Java Stream排序详解

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排序,可以轻松实现按照属性排序、多属性排序和逆序排序等功能,大大简化了代码的编写和维护。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程