Java8 到 Java21 系列之 Lambda 表達式:函數式編程的開端(Java 8)

Java8 到 Java21 系列之 Lambda 表達式:函數式編程的開端(Java 8)

系列目錄

  • Java8 到 Java21 系列之 Lambda 表達式:函數式編程的開端(Java 8)
  • Java 8 到 Java 21 系列之 Stream API:數據處理的新方式(Java 8)
  • Java 8 到 Java 21 系列之 Optional 類型:優雅地處理空值(Java 8) 更新中
  • Java 8 到 Java 21 系列之 新日期時間 API:精確的時間管理(Java 8) 更新中
  • Java 8 到 Java 21 系列之 模塊化系統:構建模塊化的 Java 應用(Java 9) 更新中
  • Java 8 到 Java 21 系列之 JShell:即時運行 Java 代碼(Java 9) 更新中
  • Java 8 到 Java 21 系列之 局部變量類型推斷:var 關鍵字的妙用(Java 10) 更新中
  • Java 8 到 Java 21 系列之 HTTP Client API:現代網絡通信的基礎(Java 11) 更新中
  • Java 8 到 Java 21 系列之 ZGC:低延遲垃圾收集器的秘密(Java 11) 更新中
  • Java 8 到 Java 21 系列之 Switch 表達式的進化(Java 12) 更新中
  • Java 8 到 Java 21 系列之 文本塊:輕松管理多行字符串(Java 13) 更新中
  • Java 8 到 Java 21 系列之 instanceof 模式匹配:簡化類型檢查(Java 14) 更新中
  • Java 8 到 Java 21 系列之 Records:數據類的全新體驗(Java 14) 更新中
  • Java 8 到 Java 21 系列之 密封類:限制繼承的藝術(Java 15) 更新中
  • Java 8 到 Java 21 系列之 外部函數與內存 API:無縫集成本地代碼(Java 17) 更新中
  • Java 8 到 Java 21 系列之 Sealed Classes 正式登場:增強類型安全性(Java 17) 更新中
  • Java 8 到 Java 21 系列之 強封裝 JDK 內部 API:保護你的應用程序(Java 17) 更新中
  • Java 8 到 Java 21 系列之 增強的偽隨機數生成器:更高質量的隨機數(Java 17) 更新中
  • Java 8 到 Java 21 系列之 虛擬線程:并發編程的新紀元(Java 21) 更新中
  • Java 8 到 Java 21 系列之 分代 ZGC 優化:邁向更高性能(Java 21) 更新中
  • Java 8 到 Java 21 系列之 序列集合 API:簡化集合操作(Java 21) 更新中

摘要與引言

自Java 8發布以來,Lambda表達式作為其核心特性之一,標志著Java進入了函數式編程的新時代。它不僅簡化了代碼結構,還使得編寫并發程序變得更加直觀和高效。通過允許行為作為參數傳遞,Lambda表達式極大地減少了模板代碼的數量,增強了代碼的可讀性和維護性。本文將深入探討Lambda表達式的概念、語法及其在Java中的應用,并通過具體的示例展示如何利用這一強大的特性來提高開發效率。同時,我們將對比傳統方法與Lambda表達式的實現,幫助讀者更好地理解其優勢。


Lambda表達式的概念

Lambda表達式是一種匿名函數,可以作為參數傳遞給方法或存儲在變量中。這種特性特別適合于只有一個抽象方法的接口——即所謂的函數式接口。通過使用Lambda表達式,開發者能夠更專注于業務邏輯本身,而不是繁瑣的實現細節。例如,它可以用來簡化集合操作、事件處理等場景,從而讓代碼更加簡潔和易讀。


Lambda表達式的語法

Lambda表達式由三個主要部分組成:

  • 參數列表
  • 箭頭操作符 ->
  • 主體(可以是一個表達式或語句塊)

以下是幾種常見的Lambda表達式形式:

1. 無參的Lambda表達式

Lambda表達式:

Runnable noArguments = () -> System.out.println("Hello World");

等價的傳統方法(匿名內部類):

Runnable noArguments = new Runnable() {@Overridepublic void run() {System.out.println("Hello World");}
};

2. 單個參數的Lambda表達式

Lambda表達式:

Consumer<String> singleParameter = s -> System.out.println(s);

等價的傳統方法(匿名內部類):

Consumer<String> singleParameter = new Consumer<String>() {@Overridepublic void accept(String s) {System.out.println(s);}
};

3. 多個參數的Lambda表達式

Lambda表達式:

BinaryOperator<Long> add = (x, y) -> x + y;

等價的傳統方法(匿名內部類):

BinaryOperator<Long> add = new BinaryOperator<Long>() {@Overridepublic Long apply(Long x, Long y) {return x + y;}
};

4. 帶語句塊的Lambda表達式

Lambda表達式:

BinaryOperator<Integer> addWithBlock = (x, y) -> {int sum = x + y;return sum;
};

等價的傳統方法(匿名內部類):

BinaryOperator<Integer> addWithBlock = new BinaryOperator<Integer>() {@Overridepublic Integer apply(Integer x, Integer y) {int sum = x + y;return sum;}
};

實際應用案例與傳統方法對比
示例1:創建線程
/*** Lambda表達式單元測試案例** @author JunLiang*/
@DisplayName("Lambda表達式單元測試案例")
public class LambdaTest {@DisplayName("測試Lambda創建線程")@Testpublic void threadTest(){// 使用匿名內部類創建線程new Thread(new Runnable() {@Overridepublic void run() {System.out.println("傳統方法!");}}).start();// 使用Lambda表達式創建線程new Thread(() -> System.out.println("Lambda表達式!")).start();}
}

在這里插入圖片描述

對比:

  • 傳統方法需要顯式地定義匿名內部類,代碼冗長且不夠直觀。
  • Lambda表達式僅需一行代碼即可完成相同功能,顯著提高了可讀性和簡潔性。

示例2:集合數據處理
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;/*** Lambda表達式單元測試案例** @author JunLiang*/
@DisplayName("Lambda表達式單元測試案例")
public class LambdaTest {@DisplayName("測試Lambda表達式排序")@Testpublic void sortTest(){List<Employee> employees = new ArrayList<>();employees.add(new Employee("Alice", 35, 75000));employees.add(new Employee("Bob", 28, 60000));employees.add(new Employee("Charlie", 40, 90000));employees.add(new Employee("David", 32, 80000));employees.add(new Employee("Eve", 25, 50000));System.out.println("傳統方法:");// 過濾年齡大于30的員工List<Employee> filtered = new ArrayList<>();for (Employee employee : employees) {if (employee.getAge() > 30) {filtered.add(employee);}}// 按工資從高到低排序Collections.sort(filtered, new Comparator<Employee>() {@Overridepublic int compare(Employee e1, Employee e2) {return Double.compare(e2.getSalary(), e1.getSalary());}});// 提取并打印名字for (Employee employee : filtered) {System.out.println(employee.getName());}System.out.println("\nLambda表達式:");// 使用Lambda表達式和Stream API處理數據List<String> result = employees.stream().filter(employee -> employee.getAge() > 30).sorted((e1, e2) -> Double.compare(e2.getSalary(), e1.getSalary())).map(Employee::getName).collect(Collectors.toList());// 輸出結果result.forEach(System.out::println);}class Employee {private String name;private int age;private double salary;public Employee(String name, int age, double salary) {this.name = name;this.age = age;this.salary = salary;}public String getName() { return name; }public int getAge() { return age; }public double getSalary() { return salary; }}
}

測試結果如下:
在這里插入圖片描述

對比:

  • 傳統方法需要手動遍歷集合進行過濾和排序,代碼量大且容易出錯。
  • Lambda表達式結合Stream API,以聲明式的方式完成復雜的數據處理任務,代碼簡潔、邏輯清晰。

結論

Lambda表達式是Java 8中最重要的新特性之一,開啟了Java編程的新篇章。通過提供更簡潔的語法和更強的表達能力,對于企業級應用來說,Lambda表達式的引入極大地提高了開發效率,降低了維護成本。它通過減少冗余代碼,增強了代碼的可讀性和可維護性。Lambda表達式幫助開發者編寫更加優雅和高效的代碼。無論是簡單的線程創建還是復雜的數據處理任務,Lambda表達式都能顯著提升開發體驗。隨著Java版本的不斷演進,Lambda表達式將在未來的版本中繼續發揮重要作用,成為現代Java應用不可或缺的一部分。

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

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

相關文章

②EtherCAT/Ethernet/IP/Profinet/ModbusTCP協議互轉工業串口網關

型號 協議轉換通信網關 EtherCAT 轉 Modbus TCP 配置說明 網線連接電腦到模塊上的 WEB 網頁設置網口&#xff0c;電腦所連網口的網段設置成 192.168.1.X&#xff08;X 是除 8 外的任一數值&#xff09;后&#xff0c;打開瀏覽器&#xff0c;地址欄輸入 192.168.1.8 &#xff…

機器視覺--python基礎語法

Python基礎語法 1. Python標識符 在 Python 里&#xff0c;標識符由字母、數字、下劃線組成。 在 Python 中&#xff0c;所有標識符可以包括英文、數字以及下劃線(_)&#xff0c;但不能以數字開頭。 Python 中的標識符是區分大小寫的。 以下劃線開頭的標識符是有特殊意義的…

算法日常記錄

1. 鏈表 1.1 刪除鏈表的倒數第 N 個結點 問題描述&#xff1a;給你一個鏈表&#xff0c;刪除鏈表的倒數第 n 個結點&#xff0c;并且返回鏈表的頭結點。 輸入&#xff1a;head [1,2,3,4,5], n 2 輸出&#xff1a;[1,2,3,5] 思路&#xff1a;先讓fast跑n步&#xff0c;然后…

14使用按鈕實現helloworld(1)

目錄 還可以通過按鈕的方式來創建 hello world 涉及Qt 中的信號槽機制本質就是給按鈕的點擊操作,關聯上一個處理函數當用戶點擊的時候 就會執行這個處理函數 connect&#xff08;誰發的信號&#xff0c; 信號類型&#xff0c; 誰來處理這個信息&#xff0c; 怎么處理的&…

【Golang】泛型與類型約束

文章目錄 一、環境二、沒有泛型的Go三、泛型的優點四、理解泛型&#xff08;一&#xff09;泛型函數&#xff08;Generic function&#xff09;1&#xff09;定義2&#xff09;調用 &#xff08;二&#xff09;類型約束&#xff08;Type constraint&#xff09;1&#xff09;接…

k8s常用總結

1. Kubernetes 架構概覽 主節點&#xff08;Master&#xff09;&#xff1a; 負責集群管理&#xff0c;包括 API Server、Controller Manager、Scheduler 和 etcd 存儲。 工作節點&#xff08;Node&#xff09;&#xff1a; 運行 Pod 和容器&#xff0c;包含 kubelet、kube-pr…

Android 單例模式全解析:從基礎實現到最佳實踐

單例模式&#xff08;Singleton Pattern&#xff09;是軟件開發中常用的設計模式&#xff0c;其核心是確保一個類在全局范圍內只有一個實例&#xff0c;并提供全局訪問點。在 Android 開發中&#xff0c;單例模式常用于管理全局資源&#xff08;如網絡管理器、數據庫助手、配置…

ffmpeg濾鏡使用

ffmpeg實現畫中畫效果 FFmpeg中&#xff0c;可以通過overlay將多個視頻流、多個多媒體采集設備、多個視頻文件合并到一個界面中&#xff0c;生成畫中畫的效果 FFmpeg 濾鏡 overlay 基本參數 x和y x坐標和Y坐標 eof action 遇到 eof表示時的處理方式&#xff0c;默認為重復。…

OpenAI即將開源!DeepSeek“逼宮”下,AI爭奪戰將走向何方?

OpenAI 終于要 Open 了。 北京時間 4 月 1 日凌晨&#xff0c;OpenAI 正式宣布&#xff1a;將在未來幾個月內開源一款具備推理能力的語言模型&#xff0c;并開放訓練權重參數。這是自 2019 年 GPT-2 部分開源以來&#xff0c;OpenAI 首次向公眾開放核心模型技術。 【圖片來源于…

貪心算法,其優缺點是什么?

什么是貪心算法&#xff1f; 貪心算法(Greedy Algorithm)是一種在每一步選擇中都采取在當前狀態下最優(局部最優)的選擇&#xff0c;從而希望導致全局最優解的算法策略。 它不像動態規劃那樣考慮所有可能的子問題&#xff0c;而是做出局部最優選擇&#xff0c;依賴這些選擇來…

python string 類型字符拼接 +=的缺點,以及取代方法

在Python中&#xff0c;使用進行字符串拼接雖然語法簡單&#xff0c;但在性能和代碼維護方面存在明顯缺陷。以下是詳細分析及替代方案&#xff1a; 一、的缺點 性能低下 內存分配問題&#xff1a;字符串在Python中不可變&#xff0c;每次操作會創建新字符串對象&#xff0c;導…

web前端開發-JS

web前端開發-JS 什么是JavaScript Web標準也稱網頁標準,由一系列的標準組成,大部分由W3C(World Wide Web Consortium,萬維網聯盟)負責制定。三個組成部分: HTML:負責網頁的結構(頁面元素和內容)。CSS:負責網頁的表現(頁面元素的外觀、位置等頁面樣式,如:顏色、大小等)。JavaS…

Turtle綜合案例實戰(繪制復雜圖形、小游戲)

在學習了 Turtle 基本的繪圖技巧后,我們可以通過結合多個概念和技巧,繪制復雜的圖形或實現簡單的小游戲。本章將介紹兩個實戰案例: 繪制復雜圖形:結合前面所學的知識,繪制一個精美的多層次復雜圖案。簡單的游戲:利用 Turtle 實現一個簡單的小游戲——蛇形游戲,這是一個經…

Python設計模式:克隆模式

1. 什么是克隆模式 克隆模式的核心思想是通過復制一個已有的對象&#xff08;原型&#xff09;來創建一個新的對象&#xff08;克隆&#xff09;。這種方式可以避免重復的初始化過程&#xff0c;從而提高效率。克隆模式通常涉及以下幾個方面&#xff1a; 原型對象&#xff1a…

邏輯漏洞之越權訪問總結

什么是越權訪問漏洞&#xff1f; “越權訪問漏洞” 是 “邏輯漏洞” 的一種&#xff0c;是由于網站系統的權限校驗的邏輯不夠嚴謹&#xff0c;沒有對用戶權限進行嚴格的身份鑒別&#xff0c;導致普通權限的用戶做到了其它普通用戶或管理員才能完成的操作&#xff0c;稱之為“越…

超短波通信模擬設備:增強通信能力的關鍵工具

在全球信息化戰爭的背景下&#xff0c;通信系統扮演著至關重要的角色。為確保通信系統的穩定性和抗干擾能力&#xff0c;超短波通信模擬設備應運而生&#xff0c;為軍事訓練和通信干擾任務提供強大的支持。 設備特點及優勢 便攜性&#xff1a;設備體積小、重量輕&#xff0c;…

C++STL——容器-vector(含部分模擬實現,即地層實現原理)(含迭代器失效問題)

目錄 容器——vector 1.構造 模擬實現 2.迭代器 模擬實現&#xff1a; ?編輯 3.容量 模擬實現&#xff1a; 4.元素的訪問 模擬實現 5.元素的增刪查改 迭代器失效問題&#xff1a; 思考問題 【注】&#xff1a;這里的模擬實現所寫的參數以及返回值&#xff0c;都是…

Ubuntu交叉編譯器工具鏈安裝

聲明 本博客所記錄的關于正點原子i.MX6ULL開發板的學習筆記&#xff0c;&#xff08;內容參照正點原子I.MX6U嵌入式linux驅動開發指南&#xff0c;可在正點原子官方獲取正點原子Linux開發板 — 正點原子資料下載中心 1.0.0 文檔&#xff09;&#xff0c;旨在如實記錄我在學校學…

Tomcat 部署 Jenkins.war 詳細教程(含常見問題解決)

在Tomcat中部署Jenkins.war文件是一個相對簡單的過程&#xff0c;以下是詳細步驟&#xff1a; 1. 準備工作 確保已安裝JDK&#xff1a;Jenkins需要Java環境&#xff0c;建議安裝JDK 8或更高版本。 下載Jenkins.war&#xff1a;https://pan.quark.cn/s/c4fd7711a1b3 下載Tomc…

DAY46 動態規劃Ⅸ 股票問題Ⅱ

188. 買賣股票的最佳時機 IV - 力扣&#xff08;LeetCode&#xff09; class Solution { public:int maxProfit(int k, vector<int>& prices) {if(prices.size()0) return 0;vector<vector<int>>dp(prices.size(),vector<int>(2*k1,0));for(int i…