什么是Lambda表達式
Lambda可以理解為是一個匿名函數(shù)腾仅,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);
//還可以繼續(xù)簡化
Thread t = new Thread(() -> System.out.println("run----"));
是不是簡潔多了?联四。
1.Lambda表達式語法
Lambda 表達式在Java 語言中引入了一個新的語法元素和操作符撑碴。這個操作符為 ->
, 該操作符被稱為 Lambda 操作符或剪頭操作符朝墩。它將 Lambda 分為兩個部分:
左側(cè): 指定了 Lambda 表達式所需要的所有參數(shù)
右側(cè):指定了 Lambda 體醉拓,即 Lambda 表達式要執(zhí)行的功能即需傳遞的方法的實現(xiàn)。
語法格式:
1). 無參,無返回值,Lambda體只需一條語句
Runnable runnable = (() -> System.out.println("run----"));
2). Lambda需要一個參數(shù)
Consumer<String> consumer = ((str) -> System.out.println(str));
//只有一個參數(shù)時收苏,參數(shù)小括號可以省略亿卤,如下
Consumer<String> consumer = (str -> System.out.println(str));
3). Lambda 需要兩個參數(shù),并且有返回值
Comparator<Integer> comparator = ((num1, num2) -> {
return num1 - num2;
});
//當表達式內(nèi)只有一條語句時鹿霸,return和大括號可以省略排吴,如下
Comparator<Integer> comparator = ((num1, num2) -> num1 - num2);
4). 數(shù)據(jù)類型可以省略,因為可由編譯器推斷得出懦鼠,稱為“類型推斷”
BinaryOperator<Long> binaryOperator = ((Long num1, Long num2) -> num1 + num2);
//(Long l1, Long l2) 中參數(shù)類型可以省略钻哩,編譯器可以自動推斷屹堰,如下↓
BinaryOperator<Long> binaryOperator = ((num1, num2) -> num1 + num2);
可以看出,相比匿名內(nèi)部類街氢,傳遞代碼變得更為直觀扯键,不再有實現(xiàn)接口的模板代碼,不再聲明方法珊肃,也名字也沒有荣刑,而是直接給出了方法的實現(xiàn)代碼
2.變量引用
? 與匿名內(nèi)部類類似,Lambda表達式也可以訪問定義在主體代碼外部的變量近范,但對于局部變量嘶摊,它也只能訪問final類型的變量,與匿名內(nèi)部類的區(qū)別是评矩,它不要求變量聲明為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
與匿名內(nèi)部內(nèi)比較
從以上內(nèi)容可以看出,Lambda表達式與匿名內(nèi)部類很像蔗喂,主要就是簡化了語法忘渔,使得編寫更加簡單,但Lambda與匿名內(nèi)部類不同的是缰儿,java會為每個匿名內(nèi)部類生成一個一個類畦粮,而Lambda表達式不會。
Lambda表達式不是匿名內(nèi)部類乖阵,那它的類型到底是什么呢宣赔?是函數(shù)式接口。
小結(jié)
? 本章介紹了Lambda表達式瞪浸,Lambda語法以及在Lambda表達式中的變量引用儒将。
原文鏈接 : Java8 新特性 Lambda表達式 | 火堯