Java中List.stream()的全面使用指南(附完整示例)
一、前言
隨著 Java 8 的推出,Stream API 成為了處理集合數(shù)據(jù)的一種高效方式。List.stream() 是 Java Stream API 的入口方法之一,它允許開發(fā)者將集合轉(zhuǎn)換為流,并通過鏈式調(diào)用實現(xiàn)諸如過濾、映射、排序等復雜邏輯。本文將系統(tǒng)地介紹 list.stream() 的使用方法,并提供大量代碼示例幫助理解。
二、什么是 Stream?
Stream 并不是一種新的數(shù)據(jù)結(jié)構(gòu),而是對集合進行函數(shù)式操作的抽象工具。它支持一系列中間操作(如 filter、map)和終端操作(如 collect、forEach),最終返回一個結(jié)果。
特點:
- 鏈式調(diào)用:多個操作可以串聯(lián)成一行清晰的語句。
- 惰性求值:中間操作不會立即執(zhí)行,直到遇到終端操作。
- 不可復用:一個 Stream 只能被消費一次。
- 并行處理能力:可通過
parallelStream()實現(xiàn)多線程處理。
三、List.stream() 的基本使用流程
List<T> result = list.stream()
.filter(...)
.map(...)
.sorted(...)
.collect(Collectors.toList());
整個過程包括:
- 創(chuàng)建流;
- 多個中間操作;
- 一個終端操作(如收集到列表、計數(shù)等)。
四、常用操作詳解與示例
(1) 過濾(Filter)
篩選滿足條件的元素。
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> evenNumbers = numbers.stream()
.filter(n -> n % 2 == 0)
.collect(Collectors.toList());
// 輸出: [2, 4]
(2) 映射(Map)
將每個元素映射為另一種形式或類型。
List<String> words = Arrays.asList("apple", "banana", "cherry");
List<Integer> wordLengths = words.stream()
.map(String::length)
.collect(Collectors.toList());
// 輸出: [5, 6, 6]
(3) 排序(Sorted)
默認按自然順序排序,也可自定義比較器。
List<String> sortedList = words.stream()
.sorted()
.collect(Collectors.toList());
// 輸出: ["apple", "banana", "cherry"]
// 按長度倒序排序
List<String> customSorted = words.stream()
.sorted((a, b) -> b.length() - a.length())
.collect(Collectors.toList());
// 輸出: ["banana", "cherry", "apple"]
(4) 去重(Distinct)
去除重復元素。
List<Integer> duplicates = Arrays.asList(1, 2, 2, 3, 3, 3);
List<Integer> unique = duplicates.stream()
.distinct()
.collect(Collectors.toList());
// 輸出: [1, 2, 3]
(5) 匹配(Match)
判斷是否滿足某些條件。
boolean hasEven = numbers.stream()
.anyMatch(n -> n % 2 == 0); // 是否存在偶數(shù)
// 輸出: true
boolean allEven = numbers.stream()
.allMatch(n -> n % 2 == 0); // 是否全為偶數(shù)
// 輸出: false
(6) 聚合操作(Reduce)
合并流中的元素,常用于求和、最大值、最小值等。
Optional<Integer> sum = numbers.stream()
.reduce(Integer::sum);
// 輸出: Optional[15]
Optional<Integer> max = numbers.stream()
.reduce(Integer::max);
// 輸出: Optional[5]
(7) 收集結(jié)果(Collect)
將流的結(jié)果收集到指定的數(shù)據(jù)結(jié)構(gòu)中。
Set<Integer> numberSet = numbers.stream()
.collect(Collectors.toSet());
Map<Integer, String> map = numbers.stream()
.collect(Collectors.toMap(
n -> n,
n -> "Num" + n
));
五、并行流(Parallel Stream)
對于大數(shù)據(jù)量處理,可使用 parallelStream() 提高性能。
List<Integer> largeList = ...; // 假設(shè)有大量數(shù)據(jù)
long count = largeList.parallelStream()
.filter(n -> n > 100)
.count();
?? 注意事項:并行流雖然提升了效率,但也可能帶來線程安全問題,需謹慎使用。
六、注意事項與最佳實踐
| 項目 | 說明 |
|---|---|
| 不可復用 | 一個 Stream 只能使用一次,重復使用會拋出異常 |
| 惰性求值 | 中間操作不會立即執(zhí)行,直到觸發(fā)終端操作 |
| 避免副作用 | 不要在 map 或 filter 中修改外部變量 |
| 合理使用并行流 | 小數(shù)據(jù)量時普通 stream 更高效,大集合才考慮 parallelStream |
七、總結(jié)
List.stream() 是 Java 8 引入的重要特性之一,極大地簡化了集合的操作邏輯,使得代碼更加簡潔、易讀、功能強大。通過本文的學習,你應該掌握了以下技能:
- 如何創(chuàng)建和使用 Stream;
- 各種常見中間操作(filter、map、sorted、distinct);
- 終端操作(collect、forEach、reduce、match);
- 并行流的基本使用;
- 使用過程中需要注意的問題。
掌握好 Stream API,是邁向現(xiàn)代 Java 開發(fā)的重要一步!
八、參考資料
到此這篇關(guān)于Java中List.stream()全面使用指南的文章就介紹到這了,更多相關(guān)Java List.stream()使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java多線程循環(huán)柵欄CyclicBarrier正確使用方法
這篇文章主要介紹了Java多線程循環(huán)柵欄CyclicBarrier正確使用方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-09-09
SpringBoot3.x接入Security6.x實現(xiàn)JWT認證的完整步驟
這篇文章主要介紹了Spring?Boot?3.x中Spring?Security?6.x的安全配置變化,特別是JWT過濾器的工作原理和配置方法,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2025-02-02
Java String字符串和Unicode字符相互轉(zhuǎn)換代碼
這篇文章主要介紹了Java String字符串和Unicode字符相互轉(zhuǎn)換代碼,需要的朋友可以參考下2014-10-10

