Java Lambda 表達式與 Stream API 全解析:從基礎到進階

以下是對您博客內容的優化版本,在保留原有核心內容的基礎上,補充了Lambda表達式及Stream API的完整方法體系,并通過結構化排版和擴展說明提升可讀性。

Java Lambda表達式與Stream API全解析:從基礎到進階

一、Lambda表達式與Stream API基礎

Lambda表達式是Java 8引入的函數式編程特性,配合Stream API可高效處理集合數據。其核心優勢在于:

  • 減少冗余代碼,提升可讀性
  • 支持并行處理,優化性能
  • 鏈式調用實現流式數據處理
二、Stream API核心方法詳解

以下以Student類為例(類定義同原博客),展示Stream API的完整方法體系:

1. 數據轉換(Map系列)

作用:將流中元素轉換為新類型。

// 基礎map:轉換元素類型
List<Integer> ages = students.stream().map(Student::getAge)  // 提取年齡,返回Stream<Integer>.collect(Collectors.toList());  // [18, 26, 30, 10, 10]// 特化map:返回基本類型流
IntStream ageStream = students.stream().mapToInt(Student::getAge);  // 直接返回IntStream,避免裝箱開銷// flatMap:合并多層流(處理嵌套集合)
List<Integer> allScores = students.stream().flatMap(student -> student.getCourses().stream())  // 將每個學生的課程流合并為一個流.collect(Collectors.toList());  // 假設getCourses()返回List<Integer>

注意map處理單個元素轉換,flatMap處理多層集合展開(如將Stream<List<T>>轉為Stream<T>)。

2. 數據過濾與去重

filter:按條件篩選元素。

List<Student> adultStudents = students.stream().filter(student -> student.getAge() > 18)  // 保留年齡>18的學生.collect(Collectors.toList());

distinct:根據元素equalshashCode去重。

List<Student> uniqueStudents = students.stream().distinct()  // 去重,需Student重寫equals和hashCode.collect(Collectors.toList());

3. 排序與限制

sorted:排序(支持自定義比較器)。

// 自然排序(年齡升序)
List<Integer> sortedAges = students.stream().map(Student::getAge).sorted()  // 等價于sorted(Comparator.naturalOrder()).collect(Collectors.toList());  // [10, 10, 18, 26, 30]// 自定義排序(年齡降序)
List<Student> sortedStudents = students.stream().sorted((s1, s2) -> s2.getAge() - s1.getAge()).collect(Collectors.toList());

limit/skip:限制流長度(limit取前n個,skip跳過前n個)。

List<Student> firstTwo = students.stream().limit(2)  // 取前2個學生.collect(Collectors.toList());

4. 聚合與歸約(Reduce)

reduce:將流中元素聚合為單個結果。

// 計算年齡總和
int totalAge = students.stream().mapToInt(Student::getAge).sum();  // 更簡潔的歸約方式,等價于:// .reduce(0, (sum, age) -> sum + age);// 復雜歸約:找出年齡最大的學生
Student oldestStudent = students.stream().reduce((s1, s2) -> s1.getAge() > s2.getAge() ? s1 : s2).orElse(null);

5. 查找與匹配

findFirst/findAny:查找第一個/任意元素(并行流中findAny效率更高)。

int firstAdultAge = students.stream().filter(s -> s.getAge() > 18).findFirst().map(Student::getAge).orElse(0);  // 若無可選元素,返回0

allMatch/anyMatch/noneMatch:判斷流中元素是否滿足條件。

boolean hasTeenager = students.stream().anyMatch(s -> s.getAge() < 20);  // 是否有青少年

6. 消費與調試(Peek)

peek:對流中元素執行操作(常用于調試)。

List<Student> debugList = students.stream().peek(s -> System.out.println("處理學生:" + s.getName())).collect(Collectors.toList());

7. 其他實用方法

count:統計元素數量。

long studentCount = students.stream().count();

collect:將流轉換為集合/Map等(配合Collectors工具類)。

// 按年齡分組
Map<Integer, List<Student>> studentsByAge = students.stream().collect(Collectors.groupingBy(Student::getAge));// 提取姓名列表
List<String> names = students.stream().map(Student::getName).collect(Collectors.toList());

三、Lambda表達式進階用法

1. 方法引用(Method Reference)

簡化Lambda表達式,直接引用已有方法。

// 等價于 x -> x.getAge()
students.stream().map(Student::getAge);// 靜態方法引用
List<String> names = students.stream().map(Student::getName).collect(Collectors.toList());
2. 構造器引用
// 將Integer列表轉為Student對象列表(假設Student有Integer參數的構造器)
List<Student> studentList = ages.stream().map(Student::new)  // 等價于 x -> new Student(x).collect(Collectors.toList());

四、性能優化與注意事項

  1. 惰性求值:Stream操作分為惰性(filter/map)和及早(collect/reduce),需調用及早操作才會執行。
  2. 并行流:大數據量時使用parallelStream()提升性能,但需注意線程安全。
  3. 裝箱開銷:使用mapToInt/mapToLong等特化方法避免自動裝箱。

五、完整示例:綜合應用

// 需求:統計年齡>20的學生姓名,按年齡降序排列,取前3個
List<String> result = students.stream().filter(s -> s.getAge() > 20)       // 過濾年齡>20.sorted((s1, s2) -> s2.getAge() - s1.getAge())  // 年齡降序.limit(3)                           // 取前3個.map(Student::getName)              // 提取姓名.collect(Collectors.toList());      // 轉換為列表

通過以上優化,內容覆蓋了Lambda與Stream API的核心方法,并補充了進階用法和性能建議,結構更清晰,示例更全面。如需進一步擴展,可加入并行流對比、自定義Collector實現等深度內容。

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

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

相關文章

Let’s Encrypt(樂此加密) 免費SSL證書申請

一、前言 騰訊云、阿里云等平臺都支持免費的SSL證書申請&#xff0c;但只支持單域名SSL證書申請&#xff0c;不支持泛域名證書申請&#xff0c;而且每年只有20張免費證書額度&#xff0c;自2024年4月25日之起免費申請的證書只有3個月有效期。域名比較多的情況下&#xff0c;更新…

SQLite3 性能優化

在嵌入式開發和輕量級應用場景中&#xff0c;SQLite3 作為輕量級數據庫引擎&#xff0c;憑借其無需獨立服務器、部署便捷等特點被廣泛應用。然而&#xff0c;當面對大量數據的高速讀寫需求時&#xff0c;默認配置下的 SQLite3 性能往往難以滿足要求。本文將從數據庫配置調整、W…

零基礎設計模式——行為型模式 - 狀態模式

第四部分&#xff1a;行為型模式 - 狀態模式 (State Pattern) 我們繼續學習行為型模式&#xff0c;接下來是狀態模式。這個模式允許一個對象在其內部狀態改變時改變它的行為&#xff0c;對象看起來就像是改變了它的類。 核心思想&#xff1a;允許一個對象在其內部狀態改變時改…

面向對象面試題集合

前言 記錄面向對象面試題相關內容&#xff0c;方便復習及查漏補缺 題1.簡述面向對象&#xff1f;主要特征是什么&#xff1f; 面向對象編程&#xff08;Object-Oriented Programming&#xff0c;簡稱OOP&#xff09;是一種以“對象”為核心的編程范式&#xff0c;通過將現實…

二十一、【用戶管理與權限 - 篇三】角色管理:前端角色列表與 CRUD 實現

【用戶管理與權限 - 篇三】角色管理:前端角色列表與 CRUD 實現 前言準備工作第一部分:更新 API 服務以包含角色管理第二部分:添加角色管理頁面的路由和側邊欄入口第三部分:實現角色列表頁面第四部分:實現角色表單對話框組件第五部分:全面測試總結前言 一個完善的權限系統…

Objective-c protocol 練習

題目描述&#xff1a; 請使用 Objective-C 中的 protocol 協議機制&#xff0c;實現一個簡易的門禁控制系統。 系統包含兩個類&#xff1a; AccessControlSystem —— 門禁系統&#xff0c;用于執行開門操作&#xff1b;Admin —— 實現權限判斷邏輯的管理員。 要求如下&am…

科技創新賦能產業創新,雙輪驅動助力新疆高質量發展!

在新疆維吾爾自治區成立70周年之際&#xff0c;中國產學研合作促進會于6月14日在烏魯木齊舉辦“天山對話&#xff1a;推動新疆科技創新與產業創新”盛會。多位院士、專家、學者及企業代表齊聚一堂&#xff0c;探尋推動新疆科技創新和產業創新的新路徑、新動能。活動現場&#x…

C#最佳實踐:推薦使用 nameof 而非硬編碼名稱

C#最佳實踐:推薦使用 nameof 而非硬編碼名稱 在 C# 編程領域,代碼的可維護性、健壯性和可讀性是衡量程序質量的重要指標。在日常開發中,我們常常會遇到需要引用類型、成員或變量名稱的場景,比如在拋出異常時指定錯誤相關的變量名、在日志記錄中標記關鍵元素名稱等。傳統的…

vue3 iframe 跨域-通訊

一、基礎嵌套方法 直接在 HTML 中使用 <iframe> 標簽指定 src 屬性&#xff1a; <iframe src"https://目標網址.com" width"800" height"600"></iframe>?限制?&#xff1a;若目標網站設置了 X-Frame-Options 響應頭&#x…

Iceberg與Hive集成深度

一、Iceberg在Hive中的ACID事務實現與實戰 1.1 傳統Hive的事務局限性 Hive原生僅支持非事務表&#xff08;Non-ACID&#xff09;&#xff0c;存在以下痛點&#xff1a; 不支持行級更新/刪除并發寫入時數據一致性無法保證無事務回滾機制歷史版本查詢需手動實現 1.2 Iceberg為…

深入剖析 Celery:分布式異步任務處理的利器

本文在創作過程中借助 AI 工具輔助資料整理與內容優化。圖片來源網絡。 文章目錄 引言一、Celery 概述1.1 Celery 的定義和作用1.2 Celery 的應用場景 二、Celery 架構分析2.1 Celery 的整體架構2.2 消息中間件&#xff08;Broker&#xff09;2.3 任務隊列&#xff08;Task Que…

Flask應用中處理異步事件(后臺線程+事件循環)的方法(2)

在上一節&#xff0c;我們講述了最簡單最基礎的后線程的建立&#xff0c;現在我們將進行拓展 Flask應用中處理異步事件&#xff08;后臺線程事件循環&#xff09;的方法&#xff08;1&#xff09; 在我們的實際應用當中&#xff0c;我們需要定義三個東西 一個多線程的信號旗&am…

C++(面向對象編程)

思維導圖 面向對象 1.面向對象思想 概念&#xff1a;面向對象編程&#xff08;OOP&#xff09;是一種以對象為基礎的編程范式&#xff0c;強調將數據和操作數據的方法封裝在一起。這就是上篇文章講過的。面向過程是以“怎么解決問題”為核心&#xff0c;而面向對象思想在于“誰…

驅動程序無法通過使用安全套接字層(SSL)加密與 SQL Server 建立安全連接,

驅動程序無法通過使用安全套接字層(SSL)加密與 SQL Server 建立安全連接,Error: “The server selected protocol version TLS10 is not accepted by client preferences [TLS13&#xff0c;TLS12]”. ClientConnectionId:d5fd8d69-ae88-4055-9f6d-6e8515224ce2】。 基本上就是…

【三大前端語言之一】交互:JavaScript詳解

【三大前端語言之一】交互&#xff1a;JavaScript詳解 在學習完HTML和CSS之后&#xff0c;最后一門前端語言——JavaScript&#xff0c;是重中之重。HTML負責頁面結構&#xff0c;CSS負責頁面樣式&#xff0c;而JavaScript則賦予網頁“生命”&#xff0c;讓網頁可以動起來、響…

LangChain面試內容整理-知識點12:檢索器(Retriever)接口與實現

在LangChain中,檢索器(Retriever)是一個抽象接口,負責根據用戶查詢從數據源中檢索相關文檔。可以把Retriever理解為“搜索工具”:給它一個未經結構化的查詢文本(如用戶問題),它返回一組與之相關的 Document 對象。內部可以基于向量相似度、數據庫查詢、甚至網絡搜索。 …

LLVM前端和優化層

文章目錄 LLVM ArchitectueLLVM 前端Lexical Analysis詞法分析Syntactic analysis 語法分析Syntactic Analyze語義分析 LLVM 優化層Pass 基礎概念Pass 依賴關系Pass API 總結 LLVM Architectue LLVM 前端 LLVM 的前端其實是把源代碼也就是 C、C、Python 這些高級語言變為編譯器…

工作流和Agent 的區別與聯系

工作流和智能體可能讓人混淆的地方就是他們都可能有大模型的加持&#xff0c;都可能有工具的加入供大模型調用&#xff0c;本文做一下對比和聯系 工作流 (Workflow) 定義&#xff1a; 工作流是一系列預定義、結構化且可重復的步驟或任務&#xff0c;旨在完成特定的業務目標或解…

leetcode--用StringBulider反轉字符串單詞的巧妙解法

反轉字符串中的單詞 這道題理想中的操作方式就是先去除前導和尾隨空格&#xff0c;之后設一個尾指針&#xff0c;往前檢索&#xff0c;掃到一個單詞就把這個單詞放到字符串的第一個位置。 很明顯&#xff0c;java中我們不能直接對字符串進行修改&#xff0c;而我們想實現一個一…

連鎖零售行業智慧能源管理解決方案:精準管控,讓每一度電創造價值

在連鎖超市、便利店等業態中&#xff0c;門店分布廣、用能場景復雜、管理成本高是普遍難題。傳統能源管理模式依賴人工抄表與分散管理&#xff0c;存在數據滯后、響應效率低、安全隱患難排查等問題。以某全國幾千家門店的連鎖便利店為例&#xff0c;其面臨的挑戰包括&#xff1…