目錄
1、list.sort()
2、Collections.sort()
3、Stream.sorted()
4、進階排序技巧
4.1 空值安全處理
4.2 多字段組合排序
4.3. 逆序
5、性能優化建議
5.1 并行流加速
5.2 原地排序
6、最佳實踐
7、注意事項
前言
????????Java中對于集合的排序操作,分別為list.sort()方法,Collections.sort()方法,和Stream流實現List排序的核心技巧。
更多集合和數組的可參考:深入探討集合與數組轉換方法-CSDN博客
1、list.
sort()
(
Comparator)
?方法(推薦)這是 Java 8 引入的最推薦的排序方式,語法簡潔、可讀性強。
List<Entity> list = new ArrayList<>();
list.add(new Entity(3));
list.add(new Entity(1));
list.add(new Entity(2));list.sort(Comparator.comparing(Entity::getId));
2、Collections.sort()
(list,Comparator)適用于 Java 8 之前的版本,或者習慣使用傳統的排序方式。
Collections.sort(list, Comparator.comparing(Entity::getId));
3、Stream.sorted()
(惰性排序):適用于需要鏈式處理或中間處理的場景,但不會修改原始列表。
List<Entity> sortedList = list.stream().sorted(Comparator.comparing(Entity::getId)).collect(Collectors.toList());
@Testpublic void test1() {List<Person> originalList = new ArrayList<>();originalList.add(new Person(3,"張三"));originalList.add(new Person(1,"李四"));originalList.add(new Person(2,"王武"));List<Person> sortedList = originalList.stream().sorted(Comparator.comparing(Person::getId)).collect(Collectors.toList());sortedList.forEach(person -> System.out.println(person.getId()));}
輸出示例:
李四::1
王武::2
張三::3
2.反向排序(倒序)
@Testpublic void test1() {List<Person> originalList = new ArrayList<>();originalList.add(new Person(3,"張三"));originalList.add(new Person(1,"李四"));originalList.add(new Person(2,"王武"));List<Person> sortedList = originalList.stream().sorted(Comparator.comparing(Person::getId).reversed()).collect(Collectors.toList());sortedList.forEach(person -> System.out.println(person.getName()+"::"+person.getId()));}
輸出示例:
張三::3
王武::2
李四::1
4、進階排序技巧
4.1 空值安全處理
// 處理可能為null的字段
Comparator<Person> nullSafeComparator = Comparator.comparing(Person::getId, Comparator.nullsFirst(Comparator.naturalOrder())
);List<Person> sortedList = originalList.stream().sorted(nullSafeComparator).collect(Collectors.toList());
4.2 多字段組合排序
List<Person> sortedList = originalList.stream().sorted(Comparator.comparing(Person::getName).thenComparing(Person::getId)).collect(Collectors.toList());
4.3. 逆序
list.sort(Comparator.comparingInt(Entity::getId).reversed());
5、性能優化建議
5.1 并行流加速
使用范圍:適用于大數據量
List<Entity> sortedList = originalList.parallelStream().sorted(Comparator.comparing(Person::getId)).collect(Collectors.toList());
5.2 原地排序
使用范圍:修改原集合
originalList.sort(Comparator.comparing(Person::getId));
6、最佳實踐
1.類型明確化:
推薦指定具體集合類型
ArrayList<Entity> sortedList = originalList.stream().sorted(Comparator.comparing(Person::getId)).collect(Collectors.toCollection(ArrayList::new));
2.防御性拷貝:
保持原集合不可變
List<Entity> sortedList = new ArrayList<>(originalList);
sortedList.sort(Comparator.comparing(Entity::getId));
3.Lambda優化:
復雜場景使用Lambda表達式
List<Entity> sortedList = originalList.stream().sorted((e1, e2) -> {// 自定義比較邏輯return e1.getId().compareTo(e2.getId());}).collect(Collectors.toList());
7、注意事項
- 不可變性:
Collectors.toList()
返回的List實現可能不支持修改 - 空指針防護:推薦始終使用
Comparator.nullsFirst/nullsLast
- 性能權衡:超過10萬條數據時優先考慮傳統排序方式
- 對象狀態:Stream操作不會修改原始集合元素
舉例:
public class SortingDemo {public static void main(String[] args) {List<Entity> entities = Arrays.asList(new Entity(2, "B"),new Entity(1, "A"),new Entity(3, "C"));// 多條件排序:先按名稱倒序,再按ID正序List<Entity> sorted = entities.stream().sorted(Comparator.comparing(Entity::getName).reversed().thenComparing(Entity::getId)).collect(Collectors.toList());sorted.forEach(System.out::println);}
}class Entity {private int id;private String name;// 構造方法和getter省略
}
總結對比
????????在 Java 中,對?List
?集合進行排序是開發中非常常見的操作。
????????Java 提供了多種方式來實現排序功能,每種方法都有其適用場景和特點。可以靈活地對 Java 中的?
List
?進行排序操作,根據具體需求選擇最適合的方式。
參考文章:
1、Java Stream實現List排序的6個核心技巧_java list stream 排序-CSDN博客