一、什么是 Lambda 表達式
Lambda 表達式,也可稱為閉包,它是推動 Java 8 發布的最重要新特性,Lambda 允許把函數作為一個方法的參數(函數作為參數傳遞進方法中).使用 Lambda 表達式可以使代碼變的更加簡潔緊湊
二、使用 Lambda 有什么好處
開啟線程執行任務調度
public class LambdaDemo {
public static void main(String[] args) {
// 方式一、使用匿名內部類
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("開啟線程執行任務調度...");
}
});
// 方式二、使用 lambda 表達式
Thread therad2 = new Thread(() -> System.out.println("開啟線程執行任務調度..."));
}
}
可以從上面的例子中看出,相比於使用匿名內部類,Lambda 表達式更加簡潔
三、Lambda 表達式語法格式
(參數類型1 參數1,參數類型2 參數2) -> {
語句1;
語句2;
[return 語句];
}
1、參數類型可寫可不寫,一般情況下是不寫的,Lambda 會根據上下文去推斷參數類型
2、只有一個參數的情況下,() 可以省略不寫
3、Lambda 體中只有一條語句時,{}、return、; 可以省略不寫,注意在省略的時候要么全部不寫,要么全部要寫,不能部分省略
4、Lambda 體中有多條語句時,{} 必須要加上,如果有返回值 return 也必須加上
四、函數型接口
使用 Lambda 表達式的前提是需要函數型接口的支持,至於什么是函數型接口可以參考如下文檔
https://www.cnblogs.com/xiaomaomao/p/16459354.html
五、匿名內部類、Lambda 表達式原理
1、匿名內部類原理
// 自定義接口
interface Flyable {
void fly(String userName);
}
public class LambdaDemo {
public static void main(String[] args) {
LambdaDemo lambdaDemo = new LambdaDemo();
lambdaDemo.flying(new Flyable() {
@Override
public void fly(String userName) {
System.out.println(userName + " want to fly");
}
});
}
public void flying(Flyable flyable) {
flyable.fly("summer");
}
}
上面是通過匿名內部類實現的代碼,實際上匿名內部類會在編譯期產生一個中間類,該中間類的偽代碼如下
// LambdaDemo$1 是編譯期產生的中間類名稱,LambdaDemo 是類名,$1 是第 1 個
class LambdaDemo$1 implements Flyable{
public void fly(String userName) {
System.out.println(userName + " want to fly");
}
}
通過 IDEA debug 可以找到該中間類
2、Lambda 表達式原理(實現偽代碼)
public class LambdaDemo {
public static void main(String[] args) {
LambdaDemo lambdaDemo = new LambdaDemo();
lambdaDemo.flying(new Flyable() {
@Override
public void fly(String userName) {
// 匿名內部類中調用生成的 私有靜態 方法
LambdaDemo.lambda$main$0(userName);
}
});
}
// Lambda 表達式在運行期會生成一個 私有的靜態方法,該方法的實現就是 Lambda 體的內容
private static void lambda$main$0(String userName) {
System.out.println(userName + " want to fly");
}
public void flying(Flyable flyable) {
flyable.fly("summer");
}
}
Lambda 表達式實現原理
1、在本類中生成一個 私有靜態 方法,該方法的內容就是 Lambda 體中的內容
2、匿名內部類中調用生成的 私有靜態 方法