前置知识: Java

Java Comparator/Comparable 语法速查手册

1 min入门

Java Comparator/Comparable 语法速查手册 的完整教学讲解。

0. 本节阅读指引(先读这一节)

本篇是「Comparable / Comparator」语法速查手册,按需查阅。

零基础第一遍只读:Comparable 自然排序、Comparator 比较器、排序使用三节,掌握两种排序方式的选择;基本类型比较、自定义比较器遇到再查。

前置:020 集合框架详解。

Comparable 自然排序

基本写法:实现 Comparable

public class <类> implements Comparable<<类>> {
  public int compareTo(<类> other) { ... }
}
// 定义自然排序
public class Person implements Comparable<Person> {
    private int age;
    public int compareTo(Person other) {
        return Integer.compare(this.age, other.age);
    }
}

Comparator 比较器

基本写法:创建比较器 Comparator.<comparing方法>(<keyExtractor>);

// 按属性创建比较器
Comparator<Person> byAge = Comparator.comparingInt(Person::getAge);

基本写法:链式比较 <comparator>.thenComparing(<keyExtractor>);

// 主排序字段相等时用次排序字段
Comparator<Person> c = Comparator
    .comparing(Person::getDept)
    .thenComparingInt(Person::getAge);

基本写法:反向 <comparator>.reversed();

// 反转排序
Comparator<Person> desc = byAge.reversed();

基本写法:nulls 优先 Comparator.nullsFirst(<比较器>);

// null 排在最前
Comparator<String> c = Comparator.nullsFirst(Comparator.naturalOrder());

基本写法:nulls 最后 Comparator.nullsLast(<比较器>);

// null 排在最后
Comparator<String> c = Comparator.nullsLast(Comparator.naturalOrder());

基本写法:自然顺序 Comparator.naturalOrder();

// 使用元素自然顺序
Comparator<String> c = Comparator.naturalOrder();

基本写法:反向自然顺序 Comparator.reverseOrder();

// 反向自然顺序
Comparator<String> c = Comparator.reverseOrder();

排序使用

基本写法:集合排序 <list>.sort(<比较器>);

// 用比较器排序
list.sort(Comparator.comparing(Person::getName));

基本写法:Stream 排序 <stream>.sorted(<比较器>);

// 流排序
list.stream().sorted(Comparator.comparingInt(Person::getAge).reversed());

基本写法:求最大最小 <stream>.max(<比较器>);

// 用比较器求最大值
Optional<Person> oldest = list.stream().max(Comparator.comparingInt(Person::getAge));

基本类型比较

基本写法:Integer 比较 Integer.compare(<a>, <b>);

// 比较两个 int 返回 -1/0/1
int r = Integer.compare(1, 2);

基本写法:比较静态方法 <包装类>.compare(<a>, <b>);

// Long/Double 等都有 compare
int r = Double.compare(1.0, 2.0);

基本写法:Objects.compare Objects.compare(<a>, <b>, <比较器>);

// 工具方法
int r = Objects.compare("a", "b", Comparator.naturalOrder());

自定义比较器

基本写法:lambda 比较 Comparator<<类型>> <变量> = (a, b) -> <表达式>;

// 用 lambda 自定义比较逻辑
Comparator<String> byLen = (a, b) -> Integer.compare(a.length(), b.length());

基本写法:comparingDouble Comparator.comparingDouble(<keyExtractor>);

// 按 double 属性比较
Comparator<Product> byPrice = Comparator.comparingDouble(Product::getPrice);

基本写法:comparingLong Comparator.comparingLong(<keyExtractor>);

// 按 long 属性比较
Comparator<Event> byTime = Comparator.comparingLong(Event::getTimestamp);