Java Lambda 表達式詳解:發展史、語法、使用場景及代碼示例

Java Lambda 表達式詳解:發展史、語法、使用場景及代碼示例

在這里插入圖片描述

在這里插入圖片描述


1. Lambda 表達式的發展史

背景與動機
  • JDK 7 前:Java的匿名內部類雖強大,但代碼冗余(如事件監聽器、集合遍歷)。
  • JDK 8(2014):引入Lambda表達式,支持函數式編程,簡化代碼。
核心目標
  • 代碼簡潔:用一行代碼替代冗長的匿名內部類。
  • 函數式接口:通過@FunctionalInterface標注單方法接口。
  • 并行處理:結合Stream API實現集合的并行操作。

2. Lambda 表達式語法

基本結構
(parameters) -> expression body
關鍵部分
部分說明
參數列表可省略類型(類型推導),多個參數用逗號分隔,無參數用()
箭頭->分隔參數和主體。
表達式主體單表達式(自動返回值)或代碼塊(需return且無返回值時需void)。

3. 使用場景與代碼示例

場景1:集合遍歷
// 傳統方式(匿名內部類)
list.forEach(new Consumer<String>() {@Overridepublic void accept(String s) {System.out.println(s);}
});// Lambda方式
list.forEach(s -> System.out.println(s)); // 省略參數類型
場景2:函數式接口
@FunctionalInterface
interface MathOperation {int operate(int a, int b);
}// 使用Lambda實現接口
MathOperation add = (a, b) -> a + b;
System.out.println(add.operate(5, 3)); // 輸出8
場景3:Comparator 排序
// 傳統方式
Collections.sort(list, new Comparator<String>() {@Overridepublic int compare(String a, String b) {return b.compareTo(a); // 降序}
});// Lambda方式
list.sort((a, b) -> b.compareTo(a));
場景4:Stream API 處理集合
List<String> filtered = list.stream().filter(s -> s.length() > 3) // 過濾長度>3的字符串.map(String::toUpperCase)    // 轉大寫.sorted()                    // 排序.collect(Collectors.toList());
場景5:事件監聽器
// 傳統方式
button.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {System.out.println("Button clicked!");}
});// Lambda方式
button.addActionListener(e -> System.out.println("Button clicked!"));
場景6:并行處理
// 并行流計算總和
int sum = numbers.parallelStream().filter(n -> n % 2 == 0) // 過濾偶數.mapToInt(Integer::intValue).sum();
場景7:方法引用
// 直接調用已有方法
List<String> names = Arrays.asList("Alice", "Bob");
names.forEach(System.out::println); // 方法引用PrintStream.println()

4. 關鍵特性詳解

(1) 類型推導
// 省略參數類型
List<Integer> numbers = Arrays.asList(1, 2, 3);
numbers.forEach(n -> System.out.println(n)); // 推導為int
(2) 代碼塊與返回值
// 單表達式(自動返回)
Function<Integer, String> toHex = i -> "#" + Integer.toHexString(i);// 代碼塊(需顯式return)
Function<Integer, String> toHexWithBlock = i -> {String hex = Integer.toHexString(i);return "#" + hex;
};
(3) 作用域與狀態
  • 有效變量:只能訪問最終變量(final或實際不可變)。
    final int factor = 2;
    list.forEach(n -> System.out.println(n * factor)); // 合法
    

5. 表格總結:Lambda 使用場景與代碼示例

場景代碼示例說明
集合遍歷list.forEach(s -> System.out.println(s));替代for循環或Iterator
函數式接口實現MathOperation add = (a, b) -> a + b;用Lambda替代匿名內部類實現單方法接口。
Comparator排序list.sort((a, b) -> b.compareTo(a));簡潔的排序邏輯。
Stream數據處理filtered = list.stream().filter(...).collect(...);聲明式數據處理,支持鏈式調用。
事件監聽button.addActionListener(e -> ...);替代冗長的匿名內部類。
并行計算sum = numbers.parallelStream().mapToInt(...).sum();利用多核CPU加速計算。
方法引用names.forEach(System.out::println);直接引用已有方法,更簡潔。

6. 注意事項

  1. 函數式接口:必須且只能有一個抽象方法(可通過@FunctionalInterface驗證)。
  2. 并行流:需注意線程安全(如ArrayList在并行流中可能引發ConcurrentModificationException)。
  3. 性能:Lambda本質是編譯器語法糖,最終生成invokeLambda字節碼。
  4. IDE支持:現代IDE(如IntelliJ)可自動將匿名內部類轉換為Lambda。

7. 進階應用:Predicate 和 Consumer

// Predicate(布爾條件)
Predicate<String> isLongString = s -> s.length() > 5;
System.out.println(isLongString.test("Hello")); // false// Consumer(無返回值操作)
Consumer<Integer> printSquare = n -> System.out.println(n * n);
printSquare.accept(5); // 輸出25

8. 總結

Lambda 表達式是 Java 8 的核心特性,極大簡化了函數式編程和集合處理。通過結合Stream API和函數式接口,開發者可以編寫更簡潔、易讀的代碼,同時提升性能和可維護性。建議在需要回調、事件處理或數據流操作時優先使用Lambda。

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

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

相關文章

Linux 命令全解析:從零開始掌握 Linux 命令行

Linux 作為一款強大的開源操作系統&#xff0c;廣泛應用于服務器、嵌入式系統以及超級計算機領域。掌握 Linux 命令行技能&#xff0c;是每一位開發者和系統管理員的必備能力。本文將從基礎開始&#xff0c;為你詳細介紹常用的 Linux 命令&#xff0c;以及它們的使用場景和示例…

【已更新完畢】2025泰迪杯數據挖掘競賽C題數學建模思路代碼文章教學:競賽智能客服機器人構建

完整內容請看文末最后的推廣群 基于大模型的競賽智能客服機器人構建 摘要 隨著國內學科和技能競賽的增多&#xff0c;參賽者對競賽相關信息的需求不斷上升&#xff0c;但傳統人工客服存在效率低、成本高、服務不穩定和用戶體驗差的問題。因此&#xff0c;設計一款智能客服機器…

關于汽車輔助駕駛不同等級、技術對比、傳感器差異及未來發展方向的詳細分析

以下是關于汽車輔助駕駛不同等級、技術對比、傳感器差異及未來發展方向的詳細分析&#xff1a; 一、汽車輔助駕駛等級詳解 根據SAE&#xff08;國際自動機工程師學會&#xff09;的標準&#xff0c;自動駕駛分為 L0到L5 六個等級&#xff1a; 1. L0&#xff08;無自動化&…

神經網絡如何表示數據

神經網絡是如何工作的&#xff1f;這是一個讓新手和專家都感到困惑的問題。麻省理工學院計算機科學和人工智能實驗室&#xff08;CSAIL&#xff09;的一個團隊表示&#xff0c;理解這些表示&#xff0c;以及它們如何為神經網絡從數據中學習的方式提供信息&#xff0c;對于提高深…

網絡復習二(TCP【3】)

一、為什么TIME_WAIT等待的時間是2MSL&#xff1f; MSL&#xff1a;報文最大生存時間 我們要知道TCP報文是基于IP協議生存的&#xff0c;而在IP頭中有一個TTL&#xff08;經過路由跳數&#xff09;&#xff0c;當TTL為0使&#xff0c;數據報被丟失&#xff0c;同時發送ICMP報…

Go:基本數據

文章目錄 整數浮點數復數布爾值字符串字符串字面量UnicodeUTF - 8字符串和字節 slice字符串和數字的相互轉換 常量常量生成器 iota無類型常量 整數 分類 Go 的整數類型按大小分有 8 位、16 位、32 位、64 位 &#xff0c;同時有符號整數包括int8、int16、int32、int64 &#…

0x03.Redis 通常應用于哪些場景?

回答重點 1)緩存(Cache): Redis 最常用的場景是作為緩存層,以減少數據庫的負載,提高數據讀取速度。例如,常用的用戶會話數據和頁面渲染結果可以存儲在 Redis 中。2)分布式鎖(Distributed Lock): Redis 可以用作分布式鎖的實現,確保在分布式系統中資源的安全訪問,避免…

大數據學習筆記

文章目錄 1. 大數據概述1.1 大數據的特性1.2 大數據技術生態1.2.1 Hadoop 的概念特性1.2.2 Hadoop生態圈 — 核心組件與技術棧1.2.3 Hadoop生態演進趨勢 2. 數據處理流程與技術棧2.1 數據采集2.1.1 日志采集工具2.1.2 實時數據流2.1.3 數據遷移 2.2 數據預處理2.2.1 批處理2.2.…

Spring Boot 自定義商標(Logo)的完整示例及配置說明( banner.txt 文件和配置文件屬性信息)

Spring Boot 自定義商標&#xff08;Logo&#xff09;的完整示例及配置說明 1. Spring Boot 商標&#xff08;Banner&#xff09;功能概述 Spring Boot 在啟動時會顯示一個 ASCII 藝術的商標 LOGO&#xff08;默認為 Spring 的標志&#xff09;。開發者可通過以下方式自定義&a…

1. k8s的簡介

Kubernetes&#xff08;k8s&#xff09;簡介 1. 產生背景 隨著云計算和微服務架構的興起&#xff0c;傳統的單體應用逐漸被拆分為多個小型、松耦合的服務&#xff08;微服務&#xff09;。這種架構雖然提升了開發靈活性和可維護性&#xff0c;但也帶來了新的挑戰&#xff1a;…

OpenCV 圖形API(35)圖像濾波-----中值模糊函數medianBlur()

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 使用中值濾波器模糊圖像。 該函數使用帶有 ksizeksize 開口的中值濾波器來平滑圖像。多通道圖像的每個通道都是獨立處理的。輸出圖像必須與輸入…

03 UV

04 Display工具欄_嗶哩嗶哩_bilibili 講的很棒 ctrlMMB 移動點 s 打針 ss 批量打針

PTA:古風排版

中國的古人寫文字&#xff0c;是從右向左豎向排版的。本題就請你編寫程序&#xff0c;把一段文字按古風排版。 輸入格式&#xff1a; 輸入在第一行給出一個正整數N&#xff08;<100&#xff09;&#xff0c;是每一列的字符數。第二行給出一個長度不超過1000的非空字符串&a…

每日一題(小白)暴力娛樂篇30

順時針旋轉&#xff0c;從上圖中不難看出行列進行了變換。因為這是一道暴力可以解決的問題&#xff0c;我們直接嘗試使用行列轉換看能不能得到想要的結果。 public static void main(String[] args) {Scanner scan new Scanner(System.in);int nscan.nextInt();int mscan.next…

邊緣計算場景下的模型輕量化:TensorRT部署YOLOv7的端到端優化指南

一、邊緣計算場景下的技術挑戰與優化路徑 在邊緣設備&#xff08;如Jetson系列&#xff09;部署YOLOv7需兼顧模型精度、推理速度與功耗限制三重約束。TensorRT作為NVIDIA官方推理加速庫&#xff0c;通過算子融合、量化壓縮和內存復用等優化技術&#xff0c;可將模型推理速度提…

rce漏洞學習

什么是rce漏洞 rce漏洞又稱遠程代碼執行漏洞&#xff0c;它允許攻擊者在目標服務器上遠程執行任意代碼或操作系統命令。rce漏洞通常出現在 應用程序提供給用戶執行命令的接口&#xff0c;例如網頁的ping功能也就是網頁的url欄&#xff0c;如果不對上傳的數據進行嚴格的管控就可…

VMware下Ubuntu空間擴容

目的&#xff1a; Ubuntu空間剩余不足&#xff0c;需要對Ubuntu進行擴容。 使用工具&#xff1a; 使用Ubuntu系統中的gparted工具進行系統擴容。 前提&#xff1a; 1、電腦有多余的未分配磁盤空間&#xff0c;比如我的Ubuntu磁盤G盤是200G&#xff0c;現在快滿了&#xff0c…

國產數據庫與Oracle數據庫事務差異分析

數據庫中的ACID是事務的基本特性&#xff0c;而在Oracle等數據庫遷移到國產數據庫國產中&#xff0c;可能因為不同數據庫事務處理機制的不同&#xff0c;在遷移后的業務邏輯處理上存在差異。本文簡要介紹了事務的ACID屬性、事務的隔離級別、回滾機制和超時機制&#xff0c;并總…

Dockerfile 學習指南和簡單實戰

引言 Dockerfile 是一種用于定義 Docker 鏡像構建步驟的文本文件。它通過一系列指令描述了如何一步步構建一個鏡像&#xff0c;包括安裝依賴、設置環境變量、復制文件等。在現實生活中&#xff0c;Dockerfile 的主要用途是幫助開發者快速、一致地構建和部署應用。它確保了應用…

青少年編程與數學 02-016 Python數據結構與算法 22課題、并行算法

青少年編程與數學 02-016 Python數據結構與算法 22課題、并行算法 一、GPU并行計算矩陣乘法示例 二、MPI并行計算allgather操作示例 三、Python中的并行計算多線程并行計算多進程并行計算 四、SIMD并行計算SIMD并行計算示例 總結 課題摘要: 并行算法是通過同時執行多個任務或操…