stream.sorted 配合 comparator.comparing 可实现对象字段自然排序,支持单字段升序、null 值处理(nullsfirst/nullslast)、多字段链式排序(thencomparing)及降序(reversed/comparingdescending),并推荐基本类型用 comparingint 等提升性能。

Stream.sorted 配合 Comparator.comparing 可以轻松实现对象字段的自然排序,核心在于将字段提取为可比较的值(如 String、Integer 等),并利用其已有的自然顺序。
基础用法:按单个字段升序排序
Comparator.comparing 接收一个 Function,用于从对象中提取用于比较的属性。该属性类型必须实现 Comparable(如 String、LocalDateTime、Integer 等),才能支持自然排序。
- 例如对 List
按 name 字段升序排列:
这里 Person::getName 返回 String,String 实现了 Comparable,因此自动按字典序升序排列。
处理 null 值:避免 NullPointerException
若被提取字段可能为 null,直接使用 comparing 会抛出异常。应配合 Comparator.nullsFirst 或 Comparator.nullsLast:
- 把 null 排在最前:Comparator.comparing(Person::getName, Comparator.nullsFirst(String::compareTo))
- 把 null 排在最后:Comparator.comparing(Person::getName, Comparator.nullsLast(String::compareTo))
注意:String::compareTo 是 String 自带的 compareTo 方法,代表其自然比较逻辑。
多字段排序:链式调用 thenComparing
使用 thenComparing 可追加次要排序条件,实现“先按 A 排,A 相同时再按 B 排”:
- 先按 age 升序,age 相同再按 name 升序:
.sorted(Comparator.comparing(Person::getAge)
.thenComparing(Person::getName))
.collect(Collectors.toList());
同样支持嵌套 null 处理,例如:thenComparing(Person::getName, Comparator.nullsLast(String::compareTo))。
降序排序:用 reversed() 或 comparingDescending()
有两种常用方式获得降序效果:
- 调用 reversed():例如 Comparator.comparing(Person::getAge).reversed()
- 使用静态方法 comparingDescending(Java 9+):Comparator.comparingInt(Person::getAge).reversed() 或 Comparator.comparing(Person::getName).reversed()
注意:comparingInt / comparingLong / comparingDouble 更高效(避免装箱),适合基本类型包装类字段;而 comparing 通用性更强,适用于任意 Comparable 类型。











