什么是Lambda表達式
Lambda可以理解為是一個匿名函數,Lambda表達式可以說是一段可以傳遞的代碼??梢詫懗龈啙?、更靈活的代碼。作為一種更緊湊的代碼風格,使Java的語言表達能力得到了提升。
在Java8以前,我們是通過接口來傳遞代碼的(面向接口的編程)。
比如:
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println("run----");
}
};
Thread th = new Thread(runnable);
這里Thread類需要的其實并不是Runnable對象,而是它的方法
public abstract void run();
但是沒有辦法直接傳遞方法,只能通過接口來傳遞。
Java8提供了一種新的緊湊的傳遞代碼的語法--就是Lambda表達式。比如剛才的Thread可以用lambda表達式修改為:
Runnable runnable = (() -> System.out.println("run----"));
Thread th = new Thread(runnable);
//還可以繼續簡化
Thread t = new Thread(() -> System.out.println("run----"));
是不是簡潔多了?。
1.Lambda表達式語法
Lambda 表達式在Java 語言中引入了一個新的語法元素和操作符。這個操作符為 ->
, 該操作符被稱為 Lambda 操作符或剪頭操作符。它將 Lambda 分為兩個部分:
左側: 指定了 Lambda 表達式所需要的所有參數
右側:指定了 Lambda 體,即 Lambda 表達式要執行的功能即需傳遞的方法的實現。
語法格式:
1). 無參,無返回值,Lambda體只需一條語句
Runnable runnable = (() -> System.out.println("run----"));
2). Lambda需要一個參數
Consumer<String> consumer = ((str) -> System.out.println(str));
//只有一個參數時,參數小括號可以省略,如下
Consumer<String> consumer = (str -> System.out.println(str));
3). Lambda 需要兩個參數,并且有返回值
Comparator<Integer> comparator = ((num1, num2) -> {
return num1 - num2;
});
//當表達式內只有一條語句時,return和大括號可以省略,如下
Comparator<Integer> comparator = ((num1, num2) -> num1 - num2);
4). 數據類型可以省略,因為可由編譯器推斷得出,稱為“類型推斷”
BinaryOperator<Long> binaryOperator = ((Long num1, Long num2) -> num1 + num2);
//(Long l1, Long l2) 中參數類型可以省略,編譯器可以自動推斷,如下↓
BinaryOperator<Long> binaryOperator = ((num1, num2) -> num1 + num2);
可以看出,相比匿名內部類,傳遞代碼變得更為直觀,不再有實現接口的模板代碼,不再聲明方法,也名字也沒有,而是直接給出了方法的實現代碼
2.變量引用
? 與匿名內部類類似,Lambda表達式也可以訪問定義在主體代碼外部的變量,但對于局部變量,它也只能訪問final類型的變量,與匿名內部類的區別是,它不要求變量聲明為final,但變量事實上不能被重新賦值。比如:
Integer num = 1;
Function<Integer, Integer> function = (integer -> num);
可以訪問局部變量num,但num不能被重新賦值,如果這樣寫:
Integer num = 1;
Function<Integer, Integer> function = (integer -> num++);
//編譯器報錯
//Variable used in lambda expression should be final or effectively final
與匿名內部內比較
從以上內容可以看出,Lambda表達式與匿名內部類很像,主要就是簡化了語法,使得編寫更加簡單,但Lambda與匿名內部類不同的是,java會為每個匿名內部類生成一個一個類,而Lambda表達式不會。
Lambda表達式不是匿名內部類,那它的類型到底是什么呢?是函數式接口。
小結
? 本章介紹了Lambda表達式,Lambda語法以及在Lambda表達式中的變量引用。
原文鏈接 : Java8 新特性 Lambda表達式 | 火堯