摘要:說來挺慚愧的,已經出來這么多年,在實際項目中卻很少真正使用表達式。舉個簡單例子對于無參無返回值,可以有如下寫法前的一對小括號和后面的一對大括號都不能去掉。表達式不會定義新的作用域表達式的作用域與封閉作用域相同。
說來挺慚愧的,JDK8已經出來這么多年,在實際項目中卻很少真正使用Lambda表達式。其實工作中的項目很早就從開發、測試、生產,全面使用JDK8+Tomcat8了。
所以看來是時候要重新認識下這個奇怪的東西。
沒錯,當第一次看到Lambda表達式時,我就認為這是個奇怪的東西,->寫法讓我感覺這是在寫其它語言,說好的一切皆對象呢?
表達式語法這是Lambda表達式的基本語法:
(Type1 param1, Type2 param2, ..., TypeN paramN) -> { statment1; statment2; //...... return statmentM; }
參數列表是一個逗號分隔的形式參數列表,這些參數與功能接口中單一方法的形式參數相對應。指定參數類型是可選項;如果未指定參數類型,將從上下文推斷。參數列表必須用括號括起來,但當指定的單一參數不帶參數類型時除外;指定單一形式參數時可以不帶括號。如果功能接口方法不指定任何形式參數,則必須指定空括號。
語句塊必須包含在大括號內,除非語句塊是一個方法調用語句。
舉個簡單例子對于無參無返回值,可以有如下寫法:
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;}; // 參數word的類型可以推斷時,可以去掉類型定義: TestIntf intf = (word) -> {return "Hello " + word;}; // 甚至當參數只有一個時,可以去掉左邊的小括號: TestIntf intf = word -> {return "Hello " + word;}; // 右側的方法體只有一個表達式時,可以去掉大括號,甚至連return都可以不要: TestIntf intf = word -> "Hello " + word;變量作用域
Lambda表達式內部可以訪問外部的變量,但需要注意:
局部變量無論是在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變量重復定義了。 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; }; } }
當然,引用變量是可以通過內部方法達到數據修改的。
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...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/75025.html
摘要:的一個大亮點是引入表達式,使用它設計的代碼會更加簡潔。簡介表達式的語法由參數列表箭頭符號和函數體組成。表達式示例下面就用一些例子來體驗一下表達式。類優惠政策滿足的條件,返回接收訂單對象,對訂單對象進行處理其中接收對象并返回。 Lambda 表達式(lambda expression)是一個匿名函數,Lambda表達式基于數學中的λ演算得名,直接對應于其中的lambda抽象(lambda...
摘要:歡迎進入基礎課程博客地址本系列文章將主要針對一些基礎知識點進行講解,為平時歸納所總結,不管是剛接觸開發菜鳥還是業界資深人士,都希望對廣大同行帶來一些幫助。語法是,或者更一般的,要求構造器方法是沒有參數靜態方法引用。 歡迎進入JAVA基礎課程 博客地址:https://blog.csdn.net/houjiyu...本系列文章將主要針對JAVA一些基礎知識點進行講解,為平時歸納所總結,...
摘要:歡迎進入基礎課程博客地址本系列文章將主要針對一些基礎知識點進行講解,為平時歸納所總結,不管是剛接觸開發菜鳥還是業界資深人士,都希望對廣大同行帶來一些幫助。語法是,或者更一般的,要求構造器方法是沒有參數靜態方法引用。 歡迎進入JAVA基礎課程 博客地址:https://blog.csdn.net/houjiyu...本系列文章將主要針對JAVA一些基礎知識點進行講解,為平時歸納所總結,...
摘要:很多語言等從設計之初就支持表達式。注意此時外部局部變量將自動變為作為方法返回值例子返回判斷字符串是否為空判斷字符串是否為空今天關于新特性表達式就講到這里了,接下來我會繼續講述新特性之函數式接口。 上一篇文章我們了解了Java8新特性-接口默認方法,接下來我們聊一聊Java8新特性之Lambda表達式。 Lambda表達式(也稱為閉包),它允許我們將函數當成參數傳遞給某個方法,或者把代碼...
摘要:初體驗下面進入本文的正題表達式。接下來展示表達式和其好基友的配合。吐槽一下方法引用表面上看起來方法引用和構造器引用進一步簡化了表達式的書寫,但是個人覺得這方面沒有的下劃線語法更加通用。 感謝同事【天錦】的投稿。投稿請聯系 tengfei@ifeve.com 本文主要記錄自己學習Java8的歷程,方便大家一起探討和自己的備忘。因為本人也是剛剛開始學習Java8,所以文中肯定有錯誤和理解偏...
閱讀 2283·2021-09-30 09:47
閱讀 2211·2021-09-26 09:55
閱讀 2939·2021-09-24 10:27
閱讀 1535·2019-08-27 10:54
閱讀 960·2019-08-26 13:40
閱讀 2486·2019-08-26 13:24
閱讀 2411·2019-08-26 13:22
閱讀 1721·2019-08-23 18:38