什么是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));
}
}
