Java8新特性之Lambda表達(dá)式的使用
1. lambda表達(dá)式介紹
lambda表達(dá)式是Java8提供的新特性之一,也可以稱之為閉包;它支持Java能夠進(jìn)行簡(jiǎn)單的函數(shù)式編程
,也就是說可以把一個(gè)匿名函數(shù)作為一個(gè)方法的參數(shù)進(jìn)行傳遞;其格式分為三部分,第一部分為入?yún)⒘斜?,第二部?code>->固定組成,第三部分為方法體;
public class LambdaTest { public static void main(String[] args) { // 使用lambda表達(dá)式創(chuàng)建線程 Thread thread = new Thread(() -> { System.out.println("thread running"); }); thread.start(); } }
// 運(yùn)行結(jié)果
thread running
2. lambda表達(dá)式的重要特征
可選的參數(shù)類型聲明:不需要聲明參數(shù)的類型,編譯器可以統(tǒng)一識(shí)別參數(shù)值;
public class LambdaTest { private Integer a; public LambdaTest(Integer a) { this.a = a; } public void print(LambdaInterface lambdaInterface) { lambdaInterface.print(this.a); } public static void main(String[] args) { LambdaTest lambdaTest = new LambdaTest(123); // 聲明參數(shù)類型 System.out.println("聲明參數(shù)類型"); lambdaTest.print((Integer a) -> { System.out.println("a: " + a); }); // 不聲明參數(shù)類型 System.out.println("不聲明參數(shù)類型"); lambdaTest.print((a) -> { System.out.println("a: " + a); }); } } interface LambdaInterface { void print(Integer a); }
// 運(yùn)行結(jié)果
聲明參數(shù)類型
a: 123
不聲明參數(shù)類型
a: 123
可選的參數(shù)圓括號(hào):一個(gè)參數(shù)時(shí)不需要定義圓括號(hào),但沒有參數(shù)或者多個(gè)參數(shù)時(shí)則必須要定義;
public class LambdaTest { private Integer a; public LambdaTest(Integer a) { this.a = a; } public void print(LambdaInterface lambdaInterface) { lambdaInterface.print(this.a); } public static void main(String[] args) { LambdaTest lambdaTest = new LambdaTest(123); // 定義參數(shù)圓括號(hào) System.out.println("定義參數(shù)圓括號(hào)"); lambdaTest.print((a) -> { System.out.println("a: " + a); }); // 一個(gè)參數(shù)可不定義參數(shù)圓括號(hào) System.out.println("一個(gè)參數(shù)可不定義參數(shù)圓括號(hào)"); lambdaTest.print(a -> { System.out.println("a: " + a); }); } } interface LambdaInterface { void print(Integer a); }
// 運(yùn)行結(jié)果
定義參數(shù)圓括號(hào)
a: 123
一個(gè)參數(shù)可不定義參數(shù)圓括號(hào)
a: 123
可選的大括號(hào):如果方法體僅有一個(gè)語(yǔ)句,可不需要使用大括號(hào);
public class LambdaTest { private Integer a; public LambdaTest(Integer a) { this.a = a; } public void print(LambdaInterface lambdaInterface) { lambdaInterface.print(this.a); } public static void main(String[] args) { LambdaTest lambdaTest = new LambdaTest(123); // 使用方法體大括號(hào) System.out.println("使用方法體大括號(hào)"); lambdaTest.print(a -> { System.out.println("a: " + a); }); // 一個(gè)語(yǔ)句可不使用方法體大括號(hào) System.out.println("一個(gè)語(yǔ)句可不使用方法體大括號(hào)"); lambdaTest.print(a -> System.out.println("a: " + a)); } } interface LambdaInterface { void print(Integer a); }
// 運(yùn)行結(jié)果
使用方法體大括號(hào)
a: 123
一個(gè)語(yǔ)句可不使用方法體大括號(hào)
a: 123
可選的返回關(guān)鍵字:如果方法體僅有一個(gè)表達(dá)式返回值語(yǔ)句,可不需要聲明返回關(guān)鍵字,但存在大括號(hào)時(shí)則必須聲明;
public class LambdaTest { private Integer a; private Integer b; public LambdaTest(Integer a, Integer b) { this.a = a; this.b = b; } public Integer sum(LambdaInterface lambdaInterface) { return lambdaInterface.calculate(this.a, this.b); } public static void main(String[] args) { LambdaTest lambdaTest = new LambdaTest(123, 456); // 聲明返回關(guān)鍵字 System.out.println("聲明返回關(guān)鍵字"); Integer s1 = lambdaTest.sum((Integer a, Integer b) -> { return a + b; }); System.out.println(s1); // 一個(gè)表達(dá)式返回值語(yǔ)句可不聲明返回關(guān)鍵字 System.out.println("一個(gè)表達(dá)式返回值語(yǔ)句可不聲明返回關(guān)鍵字"); Integer s2 = lambdaTest.sum((a, b) -> a + b); System.out.println(s2); } } interface LambdaInterface { Integer calculate(Integer a, Integer b); }
// 運(yùn)行結(jié)果
聲明返回關(guān)鍵字
579
一個(gè)表達(dá)式返回值語(yǔ)句可不聲明返回關(guān)鍵字
579
3. lambda表達(dá)式對(duì)域外變量的限制
lambda表達(dá)式對(duì)域外的局部變量具有隱性final語(yǔ)義的限制,但對(duì)成員變量沒有該限制;
public class LambdaTest { private Integer a; private Integer b; public LambdaTest(Integer a, Integer b) { this.a = a; this.b = b; } public Integer sum(LambdaInterface lambdaInterface) { return lambdaInterface.calculate(this.a, this.b); } public static void main(String[] args) { LambdaTest lambdaTest = new LambdaTest(123, 456); int c = 111; Integer s1 = lambdaTest.sum((a, b) -> { // 修改域外局部變量將出現(xiàn)編譯錯(cuò)誤 c = 222; return a + b; }); System.out.println(s1); int d = 333; Integer s2 = lambdaTest.sum((a, b) -> { // 域外修改lambda表達(dá)式內(nèi)部使用過的域外局部變量也將導(dǎo)致編譯錯(cuò)誤 return a + b + d; }); d = 444; System.out.println(s2); } } interface LambdaInterface { Integer calculate(Integer a, Integer b); }
public class LambdaTest { private Integer a; private Integer b; private Integer c; public LambdaTest(Integer a, Integer b, Integer c) { this.a = a; this.b = b; this.c = c; } public Integer sum(LambdaInterface lambdaInterface) { return lambdaInterface.calculate(this.a, this.b); } public static void main(String[] args) { LambdaTest lambdaTest = new LambdaTest(123, 456, 789); Integer s1 = lambdaTest.sum((a, b) -> { // 沒有出現(xiàn)編譯錯(cuò)誤 lambdaTest.c = 999; return a + b + lambdaTest.c; }); System.out.println(s1); } } interface LambdaInterface { Integer calculate(Integer a, Integer b); }
// 運(yùn)行結(jié)果
1578
4. lambda表達(dá)式的優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
1.使代碼更加簡(jiǎn)潔;
2.減少匿名內(nèi)部類的創(chuàng)建,節(jié)省資源;
缺點(diǎn):
1.可維護(hù)性差,必須熟悉抽象方法的參數(shù)列表;
2.可讀性差,必須對(duì)lambda表達(dá)式有一定深入;
5. lambda表達(dá)式的使用場(chǎng)景
在聲明方法時(shí),方法的形參列表包含一個(gè)或者多個(gè)函數(shù)式接口就可以使用lambda表達(dá)式;如:
使用實(shí)現(xiàn)Runnable接口創(chuàng)建線程
使用實(shí)現(xiàn)Callable接口創(chuàng)建FutureTask
使用四大函數(shù)式接口消費(fèi)者接口Consumer
、提供者接口Supplier
、斷言型接口Predicate
、函數(shù)型接口Function
6. lambda表達(dá)式的實(shí)現(xiàn)原理
lambda表達(dá)式是通過特定的語(yǔ)法,讓編譯器對(duì)java文件進(jìn)行編譯時(shí),針對(duì)每一個(gè)lambda表達(dá)式會(huì)編譯成一個(gè)對(duì)應(yīng)的靜態(tài)方法,由此也可證明lambda表達(dá)式并不是一種語(yǔ)法糖;
// 對(duì)上面的LambdaTest.java編譯后的LambdaTest.class文件使用javap -p進(jìn)行查看將會(huì)得到如下結(jié)果 javap -p LambdaTest.class Compiled from "LambdaTest.java" public class cn.jackiegu.java8.study.lambda.LambdaTest { private java.lang.Integer a; private java.lang.Integer b; private java.lang.Integer c; public cn.jackiegu.java8.study.lambda.LambdaTest(java.lang.Integer, java.lang.Integer, java.lang.Integer); public java.lang.Integer sum(cn.jackiegu.java8.study.lambda.LambdaInterface); public static void main(java.lang.String[]); private static java.lang.Integer lambda$main$0(cn.jackiegu.java8.study.lambda.LambdaTest, java.lang.Integer, java.lang.Integer); }
到此這篇關(guān)于Java8新特性之Lambda表達(dá)式的使用的文章就介紹到這了,更多相關(guān)java的Lambda表達(dá)式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java8新特性:lambda表達(dá)式總結(jié)
- 簡(jiǎn)單易懂的java8新特性之lambda表達(dá)式知識(shí)總結(jié)
- JAVA8 lambda表達(dá)式權(quán)威教程
- 詳解Java8中的lambda表達(dá)式、::符號(hào)和Optional類
- java8 多個(gè)list對(duì)象用lambda求差集操作
- java8 forEach結(jié)合Lambda表達(dá)式遍歷 List操作
- Java8 Lambda表達(dá)式模板方法實(shí)現(xiàn)解析
- Java8 lambda表達(dá)式2種常用方法代碼解析
- Java8 Lambda和Invokedynamic詳情
相關(guān)文章
controller層如何同時(shí)接收兩個(gè)實(shí)體類
這篇文章主要介紹了controller層如何同時(shí)接收兩個(gè)實(shí)體類問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11Spring通過三級(jí)緩存解決循環(huán)依賴問題的過程詳解
循環(huán)依賴指的是在對(duì)象之間存在相互依賴關(guān)系,形成一個(gè)閉環(huán),導(dǎo)致無法準(zhǔn)確地完成對(duì)象的創(chuàng)建和初始化,本文主要介紹了Spring通過三級(jí)緩存解決循環(huán)依賴的方法,需要的可以參考下2023-10-10Java調(diào)用SQL腳本執(zhí)行常用的方法示例
這篇文章主要給大家介紹了關(guān)于Java調(diào)用SQL腳本執(zhí)行常用的方法的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2018-04-04關(guān)于java中基本數(shù)據(jù)類型的數(shù)值范圍
這篇文章主要介紹了關(guān)于java中基本數(shù)據(jù)類型的數(shù)值范圍,基本類型,或者叫做內(nèi)置類型,是JAVA中不同于類的特殊類型,它們是我們編程中使用最頻繁的類型,需要的朋友可以參考下2023-07-07詳解Struts2中json 相互引用死循環(huán)解決辦法
本篇文章主要介紹詳解Struts2中json 相互引用死循環(huán)解決辦法,具有一定的參考價(jià)值,有興趣的可以了解一下。2017-01-01SpringBoot Maven升級(jí)自帶的jar包版本問題
這篇文章主要介紹了SpringBoot Maven升級(jí)自帶的jar包版本問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07Java簡(jiǎn)單實(shí)現(xiàn)農(nóng)夫過河問題示例
這篇文章主要介紹了Java簡(jiǎn)單實(shí)現(xiàn)農(nóng)夫過河問題,簡(jiǎn)單描述了農(nóng)夫過河問題的概念、原理并結(jié)合簡(jiǎn)單實(shí)例形式分析了java解決農(nóng)夫過河問題的相關(guān)操作技巧,需要的朋友可以參考下2017-12-12IDEA 創(chuàng)建一個(gè)Mybatis Maven項(xiàng)目的方法步驟(圖文)
這篇文章主要介紹了IDEA 創(chuàng)建一個(gè)Mybatis Maven項(xiàng)目的方法步驟(圖文),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03