摘要:說(shuō)來(lái)挺慚愧的,已經(jīng)出來(lái)這么多年,在實(shí)際項(xiàng)目中卻很少真正使用表達(dá)式。舉個(gè)簡(jiǎn)單例子對(duì)于無(wú)參無(wú)返回值,可以有如下寫法前的一對(duì)小括號(hào)和后面的一對(duì)大括號(hào)都不能去掉。表達(dá)式不會(huì)定義新的作用域表達(dá)式的作用域與封閉作用域相同。
說(shuō)來(lái)挺慚愧的,JDK8已經(jīng)出來(lái)這么多年,在實(shí)際項(xiàng)目中卻很少真正使用Lambda表達(dá)式。其實(shí)工作中的項(xiàng)目很早就從開(kāi)發(fā)、測(cè)試、生產(chǎn),全面使用JDK8+Tomcat8了。
所以看來(lái)是時(shí)候要重新認(rèn)識(shí)下這個(gè)奇怪的東西。
沒(méi)錯(cuò),當(dāng)?shù)谝淮慰吹絃ambda表達(dá)式時(shí),我就認(rèn)為這是個(gè)奇怪的東西,->寫法讓我感覺(jué)這是在寫其它語(yǔ)言,說(shuō)好的一切皆對(duì)象呢?
表達(dá)式語(yǔ)法這是Lambda表達(dá)式的基本語(yǔ)法:
(Type1 param1, Type2 param2, ..., TypeN paramN) -> { statment1; statment2; //...... return statmentM; }
參數(shù)列表是一個(gè)逗號(hào)分隔的形式參數(shù)列表,這些參數(shù)與功能接口中單一方法的形式參數(shù)相對(duì)應(yīng)。指定參數(shù)類型是可選項(xiàng);如果未指定參數(shù)類型,將從上下文推斷。參數(shù)列表必須用括號(hào)括起來(lái),但當(dāng)指定的單一參數(shù)不帶參數(shù)類型時(shí)除外;指定單一形式參數(shù)時(shí)可以不帶括號(hào)。如果功能接口方法不指定任何形式參數(shù),則必須指定空括號(hào)。
語(yǔ)句塊必須包含在大括號(hào)內(nèi),除非語(yǔ)句塊是一個(gè)方法調(diào)用語(yǔ)句。
舉個(gè)簡(jiǎn)單例子對(duì)于無(wú)參無(wú)返回值,可以有如下寫法:
public interface TestIntf { public void sayHello(); } // -> 前的一對(duì)小括號(hào)和后面的一對(duì)大括號(hào)都不能去掉。 TestIntf intf = () -> {System.out.println("HelloWorld!!!");}; intf.sayHello();
對(duì)于有參有返回值,可以有如下寫法:
public interface TestIntf { public String sayHello(String word); } // 完整寫法 TestIntf intf = (String word) -> {return "Hello " + word;}; // 參數(shù)word的類型可以推斷時(shí),可以去掉類型定義: TestIntf intf = (word) -> {return "Hello " + word;}; // 甚至當(dāng)參數(shù)只有一個(gè)時(shí),可以去掉左邊的小括號(hào): TestIntf intf = word -> {return "Hello " + word;}; // 右側(cè)的方法體只有一個(gè)表達(dá)式時(shí),可以去掉大括號(hào),甚至連return都可以不要: TestIntf intf = word -> "Hello " + word;變量作用域
Lambda表達(dá)式內(nèi)部可以訪問(wèn)外部的變量,但需要注意:
局部變量無(wú)論是在Lambda表達(dá)式主體中聲明,還是在封閉作用域中聲明,使用之前都必須先初始化。如:
interface TestIntf { public String sayHello(String word); } public class App { public static void main(String[] args) { String str; TestIntf intf = (String word) -> { System.out.println(str); // 編譯失敗,提示str變量未被初始化。 return "Hello " + word; }; } }
Lambda表達(dá)式不會(huì)定義新的作用域;Lambda表達(dá)式的作用域與封閉作用域相同。如:
interface TestIntf { public String sayHello(String word); } public class App { public static void main(String[] args) { String str = "word"; TestIntf intf = (String word) -> { String str = ""; // 編譯失敗,提示str變量重復(fù)定義了。 return "Hello " + word; }; } }
而且也不能修改外部變量:
interface TestIntf { public String sayHello(String word); } public class App { public static void main(String[] args) { String str = "word"; TestIntf intf = (String word) -> { str = "word!!!"; // 編譯報(bào)錯(cuò):Local variable str defined in an enclosing scope must be final or effectively final return "Hello " + word; }; } }
當(dāng)然,引用變量是可以通過(guò)內(nèi)部方法達(dá)到數(shù)據(jù)修改的。
interface TestIntf { public String sayHello(StringBuilder word); } public class App { public static void main(String[] args) { StringBuilder str = new StringBuilder("word"); TestIntf intf = (StringBuilder word) -> { word.append("!!!"); return "Hello " + word; }; System.out.println(intf.sayHello(str)); // Hello word!!! System.out.println(str); // word!!! } }Lambda表達(dá)式中的this
在Lambda表達(dá)式中this引用的不是Lambda表達(dá)式對(duì)象,而是聲明它的外部對(duì)象:
interface TestIntf { public String sayHello(); } public class App { public void test() { TestIntf intf = () -> "Hello " + this.getClass().getSimpleName(); System.out.println(intf.sayHello()); } public static void main(String[] args) { App app = new App(); app.test(); // Hello App } }參考文章
https://www.oracle.com/techne...
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/75025.html
摘要:的一個(gè)大亮點(diǎn)是引入表達(dá)式,使用它設(shè)計(jì)的代碼會(huì)更加簡(jiǎn)潔。簡(jiǎn)介表達(dá)式的語(yǔ)法由參數(shù)列表箭頭符號(hào)和函數(shù)體組成。表達(dá)式示例下面就用一些例子來(lái)體驗(yàn)一下表達(dá)式。類優(yōu)惠政策滿足的條件,返回接收訂單對(duì)象,對(duì)訂單對(duì)象進(jìn)行處理其中接收對(duì)象并返回。 Lambda 表達(dá)式(lambda expression)是一個(gè)匿名函數(shù),Lambda表達(dá)式基于數(shù)學(xué)中的λ演算得名,直接對(duì)應(yīng)于其中的lambda抽象(lambda...
摘要:歡迎進(jìn)入基礎(chǔ)課程博客地址本系列文章將主要針對(duì)一些基礎(chǔ)知識(shí)點(diǎn)進(jìn)行講解,為平時(shí)歸納所總結(jié),不管是剛接觸開(kāi)發(fā)菜鳥(niǎo)還是業(yè)界資深人士,都希望對(duì)廣大同行帶來(lái)一些幫助。語(yǔ)法是,或者更一般的,要求構(gòu)造器方法是沒(méi)有參數(shù)靜態(tài)方法引用。 歡迎進(jìn)入JAVA基礎(chǔ)課程 博客地址:https://blog.csdn.net/houjiyu...本系列文章將主要針對(duì)JAVA一些基礎(chǔ)知識(shí)點(diǎn)進(jìn)行講解,為平時(shí)歸納所總結(jié),...
摘要:歡迎進(jìn)入基礎(chǔ)課程博客地址本系列文章將主要針對(duì)一些基礎(chǔ)知識(shí)點(diǎn)進(jìn)行講解,為平時(shí)歸納所總結(jié),不管是剛接觸開(kāi)發(fā)菜鳥(niǎo)還是業(yè)界資深人士,都希望對(duì)廣大同行帶來(lái)一些幫助。語(yǔ)法是,或者更一般的,要求構(gòu)造器方法是沒(méi)有參數(shù)靜態(tài)方法引用。 歡迎進(jìn)入JAVA基礎(chǔ)課程 博客地址:https://blog.csdn.net/houjiyu...本系列文章將主要針對(duì)JAVA一些基礎(chǔ)知識(shí)點(diǎn)進(jìn)行講解,為平時(shí)歸納所總結(jié),...
摘要:很多語(yǔ)言等從設(shè)計(jì)之初就支持表達(dá)式。注意此時(shí)外部局部變量將自動(dòng)變?yōu)樽鳛榉椒ǚ祷刂道臃祷嘏袛嘧址欠駷榭张袛嘧址欠駷榭战裉礻P(guān)于新特性表達(dá)式就講到這里了,接下來(lái)我會(huì)繼續(xù)講述新特性之函數(shù)式接口。 上一篇文章我們了解了Java8新特性-接口默認(rèn)方法,接下來(lái)我們聊一聊Java8新特性之Lambda表達(dá)式。 Lambda表達(dá)式(也稱為閉包),它允許我們將函數(shù)當(dāng)成參數(shù)傳遞給某個(gè)方法,或者把代碼...
摘要:初體驗(yàn)下面進(jìn)入本文的正題表達(dá)式。接下來(lái)展示表達(dá)式和其好基友的配合。吐槽一下方法引用表面上看起來(lái)方法引用和構(gòu)造器引用進(jìn)一步簡(jiǎn)化了表達(dá)式的書(shū)寫,但是個(gè)人覺(jué)得這方面沒(méi)有的下劃線語(yǔ)法更加通用。 感謝同事【天錦】的投稿。投稿請(qǐng)聯(lián)系 [email protected] 本文主要記錄自己學(xué)習(xí)Java8的歷程,方便大家一起探討和自己的備忘。因?yàn)楸救艘彩莿倓傞_(kāi)始學(xué)習(xí)Java8,所以文中肯定有錯(cuò)誤和理解偏...
閱讀 2377·2021-09-30 09:47
閱讀 2257·2021-09-26 09:55
閱讀 2991·2021-09-24 10:27
閱讀 1593·2019-08-27 10:54
閱讀 996·2019-08-26 13:40
閱讀 2529·2019-08-26 13:24
閱讀 2504·2019-08-26 13:22
閱讀 1772·2019-08-23 18:38