Java中Stream實(shí)現(xiàn)List排序的六個(gè)核心技巧總結(jié)
一、基礎(chǔ)排序?qū)崿F(xiàn)
1.1 自然序排序(正序)
List<Entity> sortedList = originalList.stream()
.sorted(Comparator.comparing(Entity::getId))
.collect(Collectors.toList());
1.2 反向排序(倒序)
List<Entity> sortedList = originalList.stream()
.sorted(Comparator.comparing(Entity::getId).reversed())
.collect(Collectors.toList());
二、進(jìn)階排序技巧
2.1 空值安全處理
// 處理可能為null的字段
Comparator<Entity> nullSafeComparator = Comparator.comparing(
Entity::getId,
Comparator.nullsFirst(Comparator.naturalOrder())
);
List<Entity> sortedList = originalList.stream()
.sorted(nullSafeComparator)
.collect(Collectors.toList());
2.2 多字段組合排序
List<Entity> sortedList = originalList.stream()
.sorted(Comparator.comparing(Entity::getDepartment)
.thenComparing(Entity::getId))
.collect(Collectors.toList());
三、性能優(yōu)化建議
3.1 并行流加速(適用于大數(shù)據(jù)量)
List<Entity> sortedList = originalList.parallelStream()
.sorted(Comparator.comparing(Entity::getId))
.collect(Collectors.toList());
3.2 原地排序(修改原集合)
originalList.sort(Comparator.comparing(Entity::getId));
四、最佳實(shí)踐
- 類(lèi)型明確化:推薦指定具體集合類(lèi)型
ArrayList<Entity> sortedList = originalList.stream()
.sorted(Comparator.comparing(Entity::getId))
.collect(Collectors.toCollection(ArrayList::new));
- 防御性拷貝:保持原集合不可變
List<Entity> sortedList = new ArrayList<>(originalList); sortedList.sort(Comparator.comparing(Entity::getId));
- Lambda優(yōu)化:復(fù)雜場(chǎng)景使用Lambda表達(dá)式
List<Entity> sortedList = originalList.stream()
.sorted((e1, e2) -> {
// 自定義比較邏輯
return e1.getId().compareTo(e2.getId());
})
.collect(Collectors.toList());
五、注意事項(xiàng)
- 不可變性:
Collectors.toList()返回的List實(shí)現(xiàn)可能不支持修改 - 空指針?lè)雷o(hù):推薦始終使用
Comparator.nullsFirst/nullsLast - 性能權(quán)衡:超過(guò)10萬(wàn)條數(shù)據(jù)時(shí)優(yōu)先考慮傳統(tǒng)排序方式
- 對(duì)象狀態(tài):Stream操作不會(huì)修改原始集合元素
六、完整示例
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")
);
// 多條件排序:先按名稱(chēng)倒序,再按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;
// 構(gòu)造方法和getter省略
}
七、總結(jié)對(duì)比
| 排序方式 | 時(shí)間復(fù)雜度 | 空間復(fù)雜度 | 適用場(chǎng)景 |
|---|---|---|---|
| Stream順序流 | O(n log n) | O(n) | 通用場(chǎng)景 |
| Stream并行流 | O(n log n) | O(n) | 大數(shù)據(jù)量(10w+) |
| Collections.sort | O(n log n) | O(1) | 原地修改需求 |
| 數(shù)據(jù)庫(kù)排序 | O(n log n) | O(1) | 數(shù)據(jù)源在數(shù)據(jù)庫(kù)時(shí) |
通過(guò)合理選擇排序策略,可以在保證代碼簡(jiǎn)潔性的同時(shí)兼顧系統(tǒng)性能。建議根據(jù)實(shí)際業(yè)務(wù)場(chǎng)景選擇最合適的排序方式。
到此這篇關(guān)于Java中Stream實(shí)現(xiàn)List排序的六個(gè)核心技巧的文章就介紹到這了,更多相關(guān)Java Stream實(shí)現(xiàn)List排序內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
spring-boot使用Admin監(jiān)控應(yīng)用的方法
本篇文章主要介紹了spring-boot使用Admin監(jiān)控應(yīng)用的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-09-09
java實(shí)現(xiàn)后臺(tái)圖片跨域上傳功能
這篇文章主要給大家介紹了關(guān)于java實(shí)現(xiàn)后臺(tái)圖片跨域上傳功能的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07
Redis中4種延時(shí)隊(duì)列實(shí)現(xiàn)方式小結(jié)
Redis作為高性能的內(nèi)存數(shù)據(jù)庫(kù),具備原子操作、數(shù)據(jù)結(jié)構(gòu)豐富和簡(jiǎn)單易用的特性,本文將介紹基于Redis實(shí)現(xiàn)分布式延時(shí)隊(duì)列的四種方式,大家可以根據(jù)需要進(jìn)行選擇2025-04-04
Springboot內(nèi)嵌tomcat應(yīng)用原理深入分析
懂得SpringBoot的童鞋應(yīng)該很清楚,不管應(yīng)用程序是屬于何種類(lèi)型,都是一個(gè)Main方法走遍天下,對(duì)于web應(yīng)用,只需要引入spring-boot-starter-web中這個(gè)依賴(lài),應(yīng)用程序就好像直接給我們來(lái)了個(gè)tomcat一樣,對(duì)于嵌入式Tomcat,其實(shí)也非常簡(jiǎn)單,就是調(diào)用Tomcat提供的外部類(lèi)2022-09-09
Spring及Mybatis整合占位符解析失敗問(wèn)題解決
這篇文章主要介紹了Spring及Mybatis整合占位符解析失敗問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07
java int轉(zhuǎn)byte和long轉(zhuǎn)byte的方法
下面小編就為大家?guī)?lái)一篇java int轉(zhuǎn)byte和long轉(zhuǎn)byte的方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-10-10

