Java 中 List.stream() 的全面使用指南(含完整示例)

標簽:Java8, Stream API, 函數式編程, 集合操作

一、前言

隨著 Java 8 的推出,Stream API 成為了處理集合數據的一種高效方式。List.stream() 是 Java Stream API 的入口方法之一,它允許開發者將集合轉換為流,并通過鏈式調用實現諸如過濾、映射、排序等復雜邏輯。本文將系統地介紹 list.stream() 的使用方法,并提供大量代碼示例幫助理解。


二、什么是 Stream?

Stream 并不是一種新的數據結構,而是對集合進行函數式操作的抽象工具。它支持一系列中間操作(如 filter、map)和終端操作(如 collect、forEach),最終返回一個結果。

特點:

  • 鏈式調用:多個操作可以串聯成一行清晰的語句。
  • 惰性求值:中間操作不會立即執行,直到遇到終端操作。
  • 不可復用:一個 Stream 只能被消費一次。
  • 并行處理能力:可通過 parallelStream() 實現多線程處理。

三、List.stream() 的基本使用流程

List<T> result = list.stream().filter(...).map(...).sorted(...).collect(Collectors.toList());

整個過程包括:

  1. 創建流;
  2. 多個中間操作;
  3. 一個終端操作(如收集到列表、計數等)。

四、常用操作詳解與示例

(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); // 是否存在偶數
// 輸出: trueboolean allEven = numbers.stream().allMatch(n -> n % 2 == 0); // 是否全為偶數
// 輸出: false

(6) 聚合操作(Reduce)

合并流中的元素,常用于求和、最大值、最小值等。

Optional<Integer> sum = numbers.stream().reduce(Integer::sum);
// 輸出: Optional[15]Optional<Integer> max = numbers.stream().reduce(Integer::max);
// 輸出: Optional[5]

(7) 收集結果(Collect)

將流的結果收集到指定的數據結構中。

Set<Integer> numberSet = numbers.stream().collect(Collectors.toSet());Map<Integer, String> map = numbers.stream().collect(Collectors.toMap(n -> n,n -> "Num" + n));

五、并行流(Parallel Stream)

對于大數據量處理,可使用 parallelStream() 提高性能。

List<Integer> largeList = ...; // 假設有大量數據
long count = largeList.parallelStream().filter(n -> n > 100).count();

?? 注意事項:并行流雖然提升了效率,但也可能帶來線程安全問題,需謹慎使用。


六、注意事項與最佳實踐

項目說明
不可復用一個 Stream 只能使用一次,重復使用會拋出異常
惰性求值中間操作不會立即執行,直到觸發終端操作
避免副作用不要在 map 或 filter 中修改外部變量
合理使用并行流小數據量時普通 stream 更高效,大集合才考慮 parallelStream

七、總結

List.stream() 是 Java 8 引入的重要特性之一,極大地簡化了集合的操作邏輯,使得代碼更加簡潔、易讀、功能強大。通過本文的學習,你應該掌握了以下技能:

  • 如何創建和使用 Stream;
  • 各種常見中間操作(filter、map、sorted、distinct);
  • 終端操作(collect、forEach、reduce、match);
  • 并行流的基本使用;
  • 使用過程中需要注意的問題。

掌握好 Stream API,是邁向現代 Java 開發的重要一步!


八、參考資料

  • Oracle 官方文檔 - Stream

如果你覺得這篇文章對你有幫助,歡迎點贊、收藏、評論,也可以關注我的 CSDN 博客獲取更多 Java 技術干貨!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/87099.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/87099.shtml
英文地址,請注明出處:http://en.pswp.cn/web/87099.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

香港 8C 站群服務器買來可以做哪些業務?

香港8C站群服務器&#xff08;即提供8個不同C段IP地址的服務器&#xff09;憑借多IP獨立分配、低延遲網絡及免備案優勢&#xff0c;適用于以下關鍵業務場景&#xff1a; 一、SEO優化與搜索引擎運營 SEO站群搭建&#xff1a;為 80-100 個網站分配 8 個不同 C 段 IP &#xff0…

UI前端與數字孿生融合新趨勢:智慧醫療的可視化診斷輔助

hello寶子們...我們是艾斯視覺擅長ui設計、前端開發、數字孿生、大數據、三維建模、三維動畫10年經驗!希望我的分享能幫助到您!如需幫助可以評論關注私信我們一起探討!致敬感謝感恩! 一、引言&#xff1a;數字孿生重塑智慧醫療診斷范式 在醫療數字化轉型的浪潮中&#xff0c;數…

OpenBayes 一周速覽丨Nanonets-OCR-s深度語義理解,精準結構化轉換;HLE人類問題推理基準上線,含2.5k題目,助力封閉式評估體系構建

公共資源速遞 5 個公共數據集&#xff1a; * Brain Tumor 腦腫瘤數據集 * HLE 人類問題推理基準數據集 * OpenThoughts3-1.2M 推理數據集 * Nemotron-Personas 人物角色數據集 * OpenMathReasoning 數學推理數據集 14 個公共教程&#xff1a; 音頻生成 * 2 視頻生成 *…

ABB CH-3185 3 bhl 000986 p 1006 ab ability 800 xa自動化系統

安全性總結(續) 操作環境 在AC 800M控制器系統上線之前&#xff0c;調查哪些環境條件適用。請特別注意以下幾點: 控制器不得暴露在超過相關技術規范中給定值的條件下。 控制器不得在暴露于強電氣干擾的環境中使用。電機可能產生超過設備允許水平的干擾&#xff0c;例如在維…

【算法】動態規劃 斐波那契類型:1137. 第 N 個泰波那契數

1137. 第 N 個泰波那契數 簡單 相關標簽 premium lock icon 相關企業 提示 泰波那契序列 Tn 定義如下&#xff1a; T0 0, T1 1, T2 1, 且在 n > 0 的條件下 Tn3 Tn Tn1 Tn2 給你整數 n&#xff0c;請返回第 n 個泰波那契數 Tn 的值。 示例 1&#xff1a; 輸入&am…

圖像編輯新變革 !ComfyUI-Kontext-fp8本地部署教程,120B參數對標閉源巨頭

一、介紹 ComfyUI 是一個強大的、模塊化的 Stable Diffusion 界面與后端項目。該用戶界面將允許用戶使用基于圖形/節點/流程圖的界面設計和執行高級穩定的擴散管道。 關于 FLUX.1 Kontext Dev FLUX.1 Kontext 是 Black Forest Labs 最新推出的突破性多模態圖像編輯模型&#…

軟件安裝——下載安裝ollama

一、下載&#xff08;模型管理工具&#xff09;&#xff1a; 下載地址&#xff1a;Ollama 二、自定義安裝&#xff1a; 1.令行安裝方式如下&#xff1a; 在OllamaSetup.exe所在目錄打開cmd命令行&#xff0c;然后命令如下&#xff1a; OllamaSetup.exe /DIRE:\AllEdit\Ai…

springboot集成mqtt收發消息

在 Spring Boot 中使用 MQTT 可以通過集成 Eclipse Paho 或 HiveMQ 等客戶端庫實現。以下是完整的整合步驟&#xff0c;包括配置、發布和訂閱消息的示例。 1. 添加 MQTT 依賴 在 pom.xml 中添加 Paho MQTT 客戶端依賴&#xff1a; <dependency><groupId>org.spri…

Java 編程之備忘錄模式

前言 有時候&#xff0c;我們真希望人生能有“CtrlZ”。在日常生活中&#xff0c;我們經常使用“撤銷”功能&#xff0c;例如在寫 Word、畫圖、寫代碼時一不小心操作失誤&#xff0c;就希望能回到之前的狀態。這種**“狀態快照 恢復”**機制&#xff0c;在設計模式中就叫做&a…

yolov13+bytetrack的目標跟蹤實現

目錄 1. 介紹 2. 相關工作 (Related Works) 3. 方法 (Method) 4. 統計和結果 5. 技術實現 ByteTrack: Multi-Object Tracking by Associating Every Detection Box 1. Motivation 2. BYTE 3. ByteTrack 具體代碼 UI界面設計 歷史記錄 完整代碼實現UI界面 1. 介紹 …

GO類型轉換與斷言面試題及參考答案

Go 中類型轉換與類型斷言的區別是什么? 在Go語言里,類型轉換和類型斷言是兩個不同的概念,它們在應用場景、語法格式以及底層實現上都存在明顯差異。 類型轉換主要用于將一種數據類型轉變為另一種數據類型,一般適用于基本數據類型之間的轉換,像整數與浮點數、字符串與字節…

【力扣 中等 C】79. 單詞搜索

目錄 題目 解法一&#xff1a;回溯 題目 解法一&#xff1a;回溯 void swap(char* a, char* b) {char tmp *a;*a *b;*b tmp; }void reverse(char* str) {int start 0, end strlen(str) - 1;while (start < end) {swap(&str[start], &str[end--]);} }bool se…

【數據標注師】分類標注

目錄 一、 **分類標注的認知底層邏輯**1. **三大核心挑戰2. **四維評估標準** 二、 **五階成長體系**? **階段1&#xff1a;分類體系深度內化&#xff08;2-4周&#xff09;**? **階段2&#xff1a;標注決策流程固化**? **階段3&#xff1a;場景化標注策略**? **階段4&…

大數據時代UI前端的智能化轉型策略:以用戶為中心的設計思維

hello寶子們...我們是艾斯視覺擅長ui設計、前端開發、數字孿生、大數據、三維建模、三維動畫10年經驗!希望我的分享能幫助到您!如需幫助可以評論關注私信我們一起探討!致敬感謝感恩! 一、引言&#xff1a;大數據驅動的 UI 前端變革浪潮 在數字化體驗競爭白熱化的今天&#xff…

【python實用小腳本-122】Detect Gender Webcam:基于Python和Keras的實時性別檢測工具

在計算機視覺和人工智能領域&#xff0c;實時性別檢測是一個具有廣泛應用前景的技術。從安防監控到智能廣告&#xff0c;性別檢測可以幫助系統更好地理解和響應用戶需求。為了實現這一功能&#xff0c;我們開發了一個基于Python和Keras的實時性別檢測工具——detect_gender_web…

Redis4

Redis除了緩存&#xff0c;還有哪些應用? Redis實現消息隊列 **使用Pub/Sub模式&#xff1a;**Redis的Pub/Sub是一種基于發布/訂閱的消息模式&#xff0c;任何客戶端都可以訂閱一個或多個頻道&#xff0c;發布者可以向特定頻道發送消息&#xff0c;所有訂閱該頻道的客戶端都會…

LEFE-Net:一種軸承故障診斷的輕量化高效特征提取網絡

一、研究背景與挑戰 軸承作為旋轉機械的核心部件&#xff0c;其健康狀態直接影響設備運行的安全性和可靠性。傳統的故障診斷方法&#xff08;如振動分析、油液檢測&#xff09;依賴人工經驗&#xff0c;效率低且易受主觀因素影響。近年來&#xff0c;基于深度學習的數據驅動方…

springboot+Apache POI 寫共導入導出

SpringBoot Apache POI 實現數據導入導出 功能特點&#xff1a; 智能列匹配&#xff1a; 支持精確列名匹配 支持忽略大小寫的列名匹配 自動匹配字段名&#xff08;當未指定ExcelProperty時&#xff09; 強大的類型轉換&#xff1a; 支持基本數據類型&#xff08;Integer/Lon…

Games101 Lecture3,Lecture4

旋轉矩陣邏輯推導 齊次坐標&#xff0c;解決平移的特殊情況 引入一個維度&#xff08;無物理意義&#xff1f;&#xff09;&#xff0c;輔助表達平移&#xff0c;為零時&#xff0c;表示向量&#xff0c;不為零時&#xff0c;表示點&#xff08;/w&#xff09; 三維旋轉矩陣 相…

折線圖多數據處理

前言&#xff1a; skline1有年份和新申請單位數&#xff0c;skline2有年份和有效期內單位數&#xff0c;我想要把1和2的年份放在一起從小到大放&#xff0c;沒有重復的&#xff0c;新申請單位數和有效期內單位數和年份的排列順序一致 實現&#xff1a; // 獲取原始數據 List…