Java 1.8 Stream 流 Sorted 排序

更新时间 2023-07-25 10:47:24

一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 50w+ 字,讲解图 2200+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 1700+ 小伙伴加入学习 ,欢迎点击围观

在 Java 1.8 中,Stream API 提供了 sorted() 方法用于对流中的元素进行排序sorted() 方法可以根据元素的自然顺序(如果元素实现了 Comparable 接口)或者根据指定的比较器进行排序。

本小节将深入介绍 Java 1.8 中的 Stream 的 sorted() 方法,并通过示例代码演示如何使用它。

sorted() 方法概览

在 Stream API 中,sorted() 方法用于对流中的元素进行排序。

Stream<T> sorted()
Stream<T> sorted(Comparator<? super T> comparator)
  • sorted() 方法使用元素的自然顺序进行排序。
  • sorted(Comparator<? super T> comparator) 方法使用指定的比较器进行排序。

使用 sorted() 方法

让我们通过几个示例来说明如何使用 sorted() 方法。

示例 1:对整数列表进行升序排序

List<Integer> numbers = Arrays.asList(5, 2, 8, 1, 3);

// 使用 sorted() 方法对整数列表进行升序排序
List<Integer> sortedNumbers = numbers.stream()
                                     .sorted()
                                     .collect(Collectors.toList());

System.out.println("Sorted numbers: " + sortedNumbers); // 输出 "Sorted numbers: [1, 2, 3, 5, 8]"

在这个例子中,我们首先创建一个整数列表 numbers。然后,我们使用 stream() 方法将列表转换为 Stream 对象,再使用 sorted() 方法对整数列表进行升序排序,并将排序结果转换为新的列表。

示例 2:对自定义对象列表按年龄进行降序排序

class Person {
    private String name;
    private int age;

    // 构造函数、Getter 和 Setter 方法

    // toString() 方法
}

List<Person> people = Arrays.asList(
    new Person("Alice", 25),
    new Person("Bob", 30),
    new Person("Charlie", 22)
);

// 使用 sorted() 方法按年龄进行降序排序
List<Person> sortedPeople = people.stream()
                                 .sorted(Comparator.comparingInt(Person::getAge).reversed())
                                 .collect(Collectors.toList());

System.out.println("Sorted people: " + sortedPeople);

在这个例子中,我们首先创建一个自定义对象列表 people,其中包含了三个 Person 对象。然后,我们使用 stream() 方法将列表转换为 Stream 对象,再使用 sorted() 方法按年龄进行降序排序,并将排序结果转换为新的列表。

示例 3:对字符串列表按长度进行排序

List<String> words = Arrays.asList("apple", "banana", "cherry", "date", "grape");

// 使用 sorted() 方法按字符串长度进行排序
List<String> sortedWords = words.stream()
                               .sorted(Comparator.comparing(String::length))
                               .collect(Collectors.toList());

System.out.println("Sorted words: " + sortedWords); // 输出 "Sorted words: [date, grape, apple, cherry, banana]"

在这个例子中,我们首先创建一个字符串列表 words。然后,我们使用 stream() 方法将列表转换为 Stream 对象,再使用 sorted() 方法按字符串长度进行排序,并将排序结果转换为新的列表。

自定义排序顺序

你也可以使用自定义的比较器来对元素进行排序。比较器可以根据你的需求制定特定的排序规则。

例如,如果你想按照某个属性的逆序进行排序,可以使用 Comparator.comparing() 方法,并使用 reversed() 方法反转排序顺序。

总结

Java 1.8 中的 Stream API 提供了 sorted() 方法,用于对流中的元素进行排序。你可以使用默认的自然顺序,也可以使用自定义的比较器来实现不同的排序方式。