Lambda表達式講解

簡介:

Lambda表達式的使用場景非常廣泛,主要包括函數式編程、集合操作、排序、線程編程、GUI事件處理、數據處理、Web開發等。

函數式編程:Lambda表達式是函數式編程的重要特性,可以用于替代傳統的匿名內部類,簡化代碼,提高可讀性。

集合操作:Lambda表達式可以與集合操作方法(如forEach、filter、map、reduce)結合使用,對集合中的元素進行遍歷、篩選、映射、聚合等操作。

排序:Lambda表達式可以用于自定義的排序功能,通過傳遞不同的比較規則實現對集合中元素的排序。

線程編程:Lambda表達式可以用于簡化線程編程中的代碼,例如使用Lambda表達式創建Runnable對象、使用Lambda表達式實現函數式接口來處理線程任務等。

GUI事件處理:Lambda表達式可以用于簡化GUI事件處理代碼,例如為按鈕、菜單等組件注冊事件監聽器。

數據處理:Lambda表達式可以用于對大數據集進行處理,如統計、過濾、轉換等,其并行處理的能力可以提高數據處理的效率。

Web開發:Lambda表達式可以用于簡化Web開發中的重復性代碼,例如通過Lambda表達式實現控制器、過濾器、攔截器等。

1) Lambda表達式僅能放入如下代碼:預定義使用了 @Functional 注釋的函數式接口,自帶一個抽象函數的方法,或者SAM(Single Abstract Method 單個抽象方法)類型。這些稱為lambda表達式的目標類型,可以用作返回類型,或lambda目標代碼的參數。例如,若一個方法接收Runnable、Comparable或者 Callable 接口,都有單個抽象方法,可以傳入lambda表達式。類似的,如果一個方法接受聲明于 java.util.function 包內的接口,例如 Predicate、Function、Consumer 或 Supplier,那么可以向其傳lambda表達式。

2) lambda表達式內可以使用方法引用,僅當該方法不修改lambda表達式提供的參數。本例中的lambda表達式可以換為方法引用,因為這僅是一個參數相同的簡單方法調用。

list.forEach(n -> System.out.println(n)); 
list.forEach(System.out::println);  // 使用方法引用

然而,若對參數有任何修改,則不能使用方法引用,而需鍵入完整地lambda表達式,如下所示:
list.forEach((String s) -> System.out.println("*" + s + "*"));

事實上,可以省略這里的lambda參數的類型聲明,編譯器可以從列表的類屬性推測出來。

3)lambda內部可以使用靜態、非靜態和局部變量,這稱為lambda內的變量捕獲。

4)Lambda表達式在Java中又稱為閉包或匿名函數,所以如果有同事把它叫閉包的時候,不用驚訝。

5)Lambda方法在編譯器內部被翻譯成私有方法,并派發 invokedynamic 字節碼指令來進行調用。可以使用JDK中的 javap 工具來反編譯class文件。使用 javap -p 或 javap -c -v 命令來看一看lambda表達式生成的字節碼。大致應該長這樣:

private static java.lang.Object lambda$0(java.lang.String);
6)lambda表達式有個限制,那就是只能引用 final 或 final 局部變量,這就是說不能在lambda內部修改定義在域外的變量。

List<Integer> primes = Arrays.asList(new Integer[]{2, 3,5,7});
int factor = 2;
primes.forEach(element -> { factor++; });
Compile time error : "local variables referenced from a lambda expression must be final or effectively final"
//另外,只是訪問它而不作修改是可以的,如下所示:
List<Integer> primes = Arrays.asList(new Integer[]{2, 3,5,7});
int factor = 2;
primes.forEach(element -> { System.out.println(factor*element); });

1、Lambda表達式概述

Lambda表達式是JDK1.8之后的一種語法,是一個匿名函數,是對匿名函數的簡寫形式,我們可以把 Lambda表達式理解為是一段可以傳遞的代碼(將代碼像數據一樣進行傳遞),可以寫出更簡潔、更靈活的代碼。作為一種更緊湊的代碼風格,使Java的語言表達能力得到了提升;

首先來看一下什么是Lambda表達式:

import java.util.Arrays;
import java.util.Comparator;
import java.util.List;public class MyTest {public static void main(String[] args) {Integer[] ints = {98, 243, 35, 13, 57, 243};List<Integer> list = Arrays.asList(ints);    //之前的排序list.sort(new Comparator<Integer>() {@Overridepublic int compare(Integer o1, Integer o2) {return o2-o1;}});System.out.println(list);//[243, 243, 98, 57, 35, 13]//使用Lambda表達式list.sort((o1,o2)->(o1-o2));System.out.println(list);//[13, 35, 57, 98, 243, 243]}
}

通過上面的對比,發現Lambda表達式式書寫起來更為簡潔;

2、Lambda表達式語法

JDK1.8之后引入的一種語法,他的寫法是使用一個->符號,箭頭將Lambda表達式分為左右兩部分,左邊寫的是實現的這個接口中的抽象方法中的形參列表,右邊就是對抽象方法的處理;

實現的這個接口中的抽象方法中的形參列表 -> 抽象方法的處理

3、具體寫法

因為Lambda表達式的核心就是實現的這個接口中的抽象方法中的形參列表 -> 抽象方法的處理,因此根據形參列表與返回值的不同,Lambda表達式的具體寫法也不相同;

無返回值有形參的抽象方法

public class MyTest1 {public static void main(String[] args) {MyInterface myInterface = new MyInterface() {@Overridepublic void show(int a, int b) {System.out.println(a + b);}};myInterface.show(20, 30);//50//簡寫1:方法名可以自己推斷出來MyInterface myInterface1 = (int a, int b) -> {System.out.println(a + b);};myInterface1.show(20, 40);//60//簡寫2:可以省略形參列表中的形參類型MyInterface myInterface2 = (a, b) -> {System.out.println(a + b);//70};myInterface2.show(20, 50);//簡寫3:如果抽象方法中只有一行代碼,可以省略方法體的大括號,當然,如果不止一行,就不能省略MyInterface myInterface3 = (a, b) -> System.out.println(a + b);myInterface3.show(20, 60);//80}
}
public interface MyInterface {public abstract void show(int a,int b);
}

可以省略方法名,IDEA會幫你自動檢測方法名;
可以省略方法中的形參類型;
如果對抽象方法的實現邏輯只有一行,可以省略方法體的大括號,當然如果不止一行,就不能省略了;

有返回值的抽象方法

public class MyTest2 {public static void main(String[] args) {MyInterface1 test1 = new MyInterface1() {@Overridepublic int test(int a, int b) {return a - b;}};System.out.println(test1.test(90, 8));//82//簡寫1:MyInterface1 test2 = (int a, int b) -> {return a - b;};System.out.println(test2.test(20, 10));//10//簡寫2:MyInterface1 test3 = (a, b) -> {return a - b;};System.out.println(test3.test(30, 10));//20//簡寫3:這個有返回值的方法,不能直接去掉大括號,還需要去掉return關鍵字MyInterface1 test4 = (a, b) -> a - b;System.out.println(test4.test(40, 10));//30}
}
public interface MyInterface1 {public abstract int test(int a,int b);
}

有返回值的方法,如果要去掉大括號,還需要去掉return關鍵字;

有一個形參的抽象方法

public class MyTest3 {public static void main(String[] args) {

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

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

相關文章

word 轉pdf 中圖片不被壓縮的方法

word 轉pdf 中圖片不被壓縮的方法 法1&#xff1a; 調節word 選項中的圖片格式為不壓縮、高保真 法2&#xff1a; 1: word 中的圖片盡可能使用高的分辨率&#xff0c;圖片存為pnd或者 tif 格式&#xff08;最高清&#xff09; 2: 轉化為pdf使用打印機器&#xff0c;參數如下…

展開說說:Android四大組件之Service使用

Service一定要開啟子線程才可以執行耗時任務嗎&#xff1f;不完全是吧。 Service是Android系統中的四大組件之一&#xff0c;它是一種沒有可視化界面&#xff0c;運行于后臺的一種服務程序。屬于計算型組件&#xff0c;用來在后臺執行持續性的計算任務&#xff0c;重要性僅次于…

分子AI預測賽筆記

#AI夏令營 #Datawhale #夏令營 Taks1 跑通baseline 根據task1跑通baseline 注冊賬號 直接注冊或登錄百度賬號&#xff0c;etc fork 項目 零基礎入門 Ai 數據挖掘競賽-速通 Baseline - 飛槳AI Studio星河社區 啟動項目 選擇運行環境&#xff0c;并點擊確定&#xff0c;沒…

臺燈學生用哪個牌子最好?學生用臺燈品牌排行榜分析

臺燈學生用哪個牌子最好&#xff1f;護眼臺燈在近年來成為家長和長時間使用電子設備人群關注的家電/學生產品。對于家中有孩子或經常面對電子屏幕的人士來說&#xff0c;很多人可能已經對這類產品有所了解并進行了購買。然而&#xff0c;部分家長對護眼臺燈的認識還不夠深入&am…

不同類型uORF對mORF翻譯效率的影響

在您提供的文獻《不同類型的uORF在真核生物基因表達中的調控潛力》中&#xff0c;對于不同類型的起始密碼子的uORF及其對下游主開放閱讀框&#xff08;mORF&#xff09;翻譯效率的影響進行了詳細的討論。以下是這些影響的主要總結&#xff1a; uORF的起始密碼子類型&#xff1a…

FFT 簡單基礎(matlab

使用 fs 進行采樣&#xff0c;進行 N點FFT 選擇顯示0~N/21點的幅值 橫坐標對應頻率計算公式&#xff1a; fs * n / N 舉個梨子&#xff1a; 頻率2kHz采樣1s&#xff0c;得到2000個點的序列y(n) 對序列y(n)做4096點的FFT 幅值響應對應的橫坐標頻率…

機器人控制系列教程之Stewart平臺簡介和運動學分析

Stewart平臺簡介及應用場景 六自由度 Stewart 并聯機器人結構簡圖如下圖所示&#xff0c;主要有一個固定平臺和一個移動平臺以及六個可伸縮的推桿組成&#xff0c;通常情況下&#xff0c;固定平臺與底座連接&#xff0c;移動平臺在空間具有六個自由度&#xff0c;通過六個推桿…

數據結構——求兩個數的最大公因子

#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> 數據結構——求兩個數的最大公因子 要求&#xff1a;必須采用遞歸和非遞歸兩種方法 非遞歸&#xff1a; int main() { int a 0; int b 0; scanf("%d %d", &a, &b); int c a…

攻防演練,怎么掃描一個網站

在 Ubuntu 22.04 上&#xff0c;你可以使用多種掃描工具來進行網站掃描。以下是一些常見的掃描工具以及它們的安裝方法&#xff1a; Nmap: Nmap 是一個開源的網絡掃描工具&#xff0c;用于發現網絡和安全審計。安裝命令&#xff1a;sudo apt update sudo apt install nmapNikto…

價格很實惠,希喂、愛立方、生生不息主食凍干抗得住實測嗎?

在挑選主食凍干時&#xff0c;許多寵物主人都會感到頭疼。盡管主食凍干相較于普通貓糧具有諸多優勢&#xff0c;但其價格也相對高昂。這導致許多寵物主人擔心高價購買的主食凍干可能營養價值并不理想。然而&#xff0c;在選擇時&#xff0c;我們還需要考慮其他重要因素&#xf…

Spring MVC 中 使用 RESTFul 實現用戶管理系統

1. Spring MVC 中 使用 RESTFul 實現用戶管理系統 文章目錄 1. Spring MVC 中 使用 RESTFul 實現用戶管理系統2. 靜態頁面準備2.1 user.css2.2 user_index.html2.3 user_list.html2.4 user_add.html2.5 user_edit.html 3. SpringMVC環境搭建3.1 創建module&#xff1a;usermgt3…

tapd 與國內外主流的8大項目管理軟件大對比

對比Tapd與8大項目管理工具&#xff1a;PingCode、Worktile、Redmine、Teambition、廣聯達、Jira、禪道、飛書。 Tapd 是騰訊推出的一款敏捷開發管理工具&#xff0c;特別適合那些需要高效協作和快速迭代的敏捷開發團隊。它支持多種敏捷方法論&#xff0c;包括Scrum和Kanban&am…

《詳細指南:本地部署Ollama大型模型的完整步驟》

《詳細指南&#xff1a;本地部署Ollama大型模型的完整步驟》 引言 Ollama是一個高性能的AI模型部署平臺&#xff0c;支持在本地輕松部署大型語言模型。本指南將詳細介紹如何在本地環境中部署Ollama&#xff0c;并運行一個大型模型。 環境要求 操作系統&#xff1a;Windows/…

數學建模------Matlab數據可視化

目錄 1.plot函數 &#xff08;1&#xff09;函數介紹 &#xff08;2&#xff09;參數介紹 &#xff08;3&#xff09;圖形美化 &#xff08;4&#xff09;背景更改 &#xff08;5&#xff09;多組繪制 &#xff08;6&#xff09;圖形疊加 &#xff08;7&#xff09;添加…

Elasticsearch備份數據到本地,并導入到新的服務 es 服務中

文章目錄 使用elasticsearch-dump工具備份安裝node.js(二進制安裝)解壓設置環境變量安裝elasticsearch-dump docker安裝使用ES備份文件到本地 使用elasticsearch-dump工具備份 這個工具備份時間比較長 安裝node.js(二進制安裝) wget https://nodejs.org/dist/v16.18.0/node-…

C語言 求分數序列的和

求分數序列2/1&#xff0c;3/2&#xff0c;5/3&#xff0c;8/5&#xff0c;13/8&#xff0c;21/13…。求出數列的n項和&#xff0c;n由鍵盤輸入&#xff0c;并計算n20的結果 這個程序計算分數序列的前 n 項和&#xff0c;并輸出 n 20 時的結果。 #include <stdio.h>in…

華為機試HJ13句子逆序

華為機試HJ13句子逆序 題目&#xff1a; 將一個英文語句以單詞為單位逆序排放。例如“I am a boy”&#xff0c;逆序排放后為“boy a am I”所有單詞之間用一個空格隔開&#xff0c;語句中除了英文字母外&#xff0c;不再包含其他字符 想法&#xff1a; 將輸入的字符串通過…

【2024最新華為OD-C/D卷試題匯總】[支持在線評測] 英文單詞聯想(100分) - 三語言AC題解(Python/Java/Cpp)

?? 大家好這里是清隆學長 ,一枚熱愛算法的程序員 ? 本系列打算持續跟新華為OD-C/D卷的三語言AC題解 ?? ACM銀牌??| 多次AK大廠筆試 | 編程一對一輔導 ?? 感謝大家的訂閱? 和 喜歡?? ??在線評測鏈接 https://app5938.acapp.acwing.com.cn/contest/2/problem/OD…

阿里云物聯網應用層開發:第二部分,云產品流轉

文章目錄 嗶哩嗶哩視頻教程1、云產品流轉概述2、我們需要創建多少個云產品流轉?3、阿里云物聯網平臺產品云流轉實現3-1 創建數據源3-2 創建數據目的3-2 創建解析器,并關聯數據、編寫腳本嗶哩嗶哩視頻教程 【阿里云物聯網綜合開發,STM32+ESP8266+微信小程序+web客戶端一篇教程…

自定義控件動畫篇(八)animateLayoutChanges與LayoutTransition的使用

在Android開發中&#xff0c;animateLayoutChanges 和 LayoutTransition 都是用來在布局改變時添加動畫效果的特性&#xff0c;但是它們的使用場景和方式有所不同。 animateLayoutChanges animateLayoutChanges 是一個布爾屬性&#xff0c;當它被設置為true時&#xff0c;會使…