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