什么是Lambda表達式:簡單來說,可以看成是對匿名內部類的縮寫,使用Lambda表達式,接口必須是函數式接口。
Lambda 表達式作用:使用 Lambda 表達式可以使代碼變的更加簡潔緊湊
Lambda 表達式,也可稱為閉包,它是推動 Java 8 發布的最重要新特性
語法
lambda 表達式的語法格式如下:
(parameters) -> expression 或 (parameters) ->{ statements; }
以下是lambda表達式的重要特征:
- 可選類型聲明:不需要聲明參數類型,編譯器可以統一識別參數值。
- 可選的參數圓括號:一個參數無需定義圓括號,但多個參數需要定義圓括號。
- 可選的大括號:如果主體包含了一個語句,就不需要使用大括號。
- 可選的返回關鍵字:如果主體只有一個表達式返回值則編譯器會自動返回值,大括號需要指定明表達式返回了一個數值。
Lambda 表達式實例
Lambda 表達式的簡單例子:
// 1. 不需要參數,返回值為 5 () -> 5 // 2. 接收一個參數(數字類型),返回其2倍的值 x -> 2 * x // 3. 接受2個參數(數字),並返回他們的差值 (x, y) -> x – y // 4. 接收2個int型整數,返回他們的和 (int x, int y) -> x + y // 5. 接受一個 string 對象,並在控制台打印,不返回任何值(看起來像是返回void) (String s) -> System.out.print(s)
==================================================
下面我們一起了解下什么叫做匿名內部類:
讓我們看看內部類跟匿名內部類概念與格式:
概述:什么是內部類的定義
將一個類A定義在另一個類B里面,里面的那個類A就被稱為內部類,B則稱為外部類
成員內部類:是定義在類中方法之外的類
定義格式如下所示:
class 外部類 { class 內部類 { } }
下面編寫一個包含內部的Person類:
package com.test.cgb; public class Person { private boolean live = true; class Heart { public void jump() { // 直接訪問外部類成員 if (live) { System.out.println("心臟在跳動"); } else { System.out.println("心臟不跳了"); } } } public boolean isLive() { return live; } public void setLive(boolean live) { this.live = live; } }
測試類如:
package com.test.cgb; import com.test.cgb.Person.Heart; public class InnerDemoTest { public static void main(String[] args) { // 創建外部類對象 Person p = new Person(); // 創建內部類對象,也就是外部類要訪問內部類的成員 Heart heart = p.new Heart(); // 調用內部類方法 heart.jump(); // 調用外部類方法 p.setLive(false); // 調用內部類方法 heart.jump(); } } 輸出結果為: 心臟在跳動 心臟不跳了
Person類經過編譯之后,源文件生成兩個字節碼文件,其中內部類仍然是一個獨立的類,在編譯之后的內部類會被編譯成獨立的.class文件,但是前面是被加上外部類的類名和$符號;比如:Person$Heart.class是分別為:
接下來我們再看看匿名內部類:
匿名內部類:是內部類的簡化寫法,它的本質是一個帶具體實現的,父類或者父接口的,匿名的,子類對象。
在開發的過程中,最常用到的就是匿名內部類了
前提:匿名內部類必須是繼承一個父類或者實現一個父接口。
,這里的類可以是具體類也可以是抽象類,本質就是一個繼承了該類或者實現了該接口的子類匿名對象。
格式如下所示:
new 父類名或者接口名() { // 方法重寫 @Override public void method() { // 執行語句 } }
以接口為例,匿名內部類的使用,代碼如下:
定義CryptonymInnerInterface接口:
package com.test.cgb; public interface CryptonymInnerInterface { // 定義一個抽象方法sum public int sum(int numberOne, int numberTwo); }
編寫測試類:
package com.test.cgb; public class CryptonymInnerTest { public static void main(String[] args) { /** * 編寫實現類的方式如 : * public class CryptonymInnerImpl implements CryptonymInnerInterface{ @Override public int sum(int numberOne, int numberTwo) { return numberOne + numberTwo; } } */ // CryptonymInnerInterface m1 = new CryptonymInnerImpl(); // int sumNumber = m1.sum(123, 456); // System.out.println(sumNumber); /* * 匿名內部類的方式:因為平時是把類看成是一個模板,為了復用性才會把類寫在一個java文件里; * 但是這里我們不需要重復使用該類,所以可以不用編寫類文件,而是使用匿名內部類的方式。 */ CryptonymInnerInterface m1 = new CryptonymInnerInterface() { @Override public int sum(int numberOne, int numberTwo) { return numberOne + numberTwo; } }; System.out.println(m1.sum(123,456)); } }