以下是使用 Java Stream 對對象列表按 id
和 age
排序的完整示例,包含升序和降序兩種場景:
1. 定義測試對象類
@Getter
@Setter
public class Person {private int id;private int age;
}
2. 排序實現代碼
import java.util.*;
import java.util.stream.Collectors;public class StreamSortExample {public static void main(String[] args) {List<Person> people = Arrays.asList(new Person(3, 25),new Person(1, 30),new Person(2, 20),);System.out.println("原始列表: " + people);// 升序排序(id優先,age次之)List<Person> ascending = people.stream().sorted(Comparator.comparing(Person::getId).thenComparing(Person::getAge)).collect(Collectors.toList());// 降序排序(id優先,age次之)List<Person> descending = people.stream().sorted(Comparator.comparing(Person::getId, Comparator.reverseOrder()).thenComparing(Person::getAge, Comparator.reverseOrder())).collect(Collectors.toList());System.out.println("升序結果: " + ascending);System.out.println("降序結果: " + descending);}
}
3. 輸出結果
原始列表: [Person{id=3, age=25}, Person{id=1, age=30}, Person{id=2, age=20}, Person{id=3, age=20}]
升序結果: [Person{id=1, age=30}, Person{id=2, age=20}, Person{id=3, age=20}, Person{id=3, age=25}]
降序結果: [Person{id=3, age=25}, Person{id=3, age=20}, Person{id=2, age=20}, Person{id=1, age=30}]
注意點說明:
-
排序優先級:
thenComparing()
表示當主排序字段(id)相同時,使用次要字段(age)繼續排序- 示例中
id=3
的兩個對象會按age
進一步排序
-
升序實現:
Comparator.comparing(Person::getId).thenComparing(Person::getAge)
-
降序實現:
Comparator.comparing(Person::getId, Comparator.reverseOrder()).thenComparing(Person::getAge, Comparator.reverseOrder())
- 每個字段的比較器都需要單獨指定排序順序
- 使用
Comparator.reverseOrder()
明確指定降序
-
擴展性:
- 要添加更多排序字段,繼續追加
.thenComparing()
- 要改變排序優先級,調整方法調用順序即可
- 要添加更多排序字段,繼續追加
動態排序,封裝成方法塊
如果需要運行時動態指定排序規則,可以使用函數式接口:
public static List<Person> sort(List<Person> list, Comparator<Person> comparator) {return list.stream().sorted(comparator).collect(Collectors.toList());
}// 調用示例
sort(people, Comparator.comparing(Person::getId).thenComparing(Person::getAge));
這種方法可以將排序邏輯與具體實現解耦,提高代碼復用性。