Java8新特性之Lambda表達(dá)式
1、Lambda 的基本介紹
Lambda Java8 的新特性之一,Lambda 是一個匿名函數(shù),我們可以把 Lambda表達(dá)式理解為是一段可以傳遞的代碼(將代碼像數(shù)據(jù)一樣進(jìn)行傳遞)??梢詫懗龈啙崱⒏`活的代碼。作為一種更緊湊的代碼風(fēng)格,使Java的語言表達(dá)能力得到了提升。
在JDK8之前,Java是不支持函數(shù)式編程的,所謂的函數(shù)編程,即可理解是將一個函數(shù)(也稱為“行為”)作為一個參數(shù)進(jìn)行傳遞。通常我們提及得更多的是面向?qū)ο缶幊?,面向?qū)ο缶幊淌菍?shù)據(jù)的抽象(各種各樣的POJO類),而函數(shù)式編程則是對行為的抽象(將行為作為一個參數(shù)進(jìn)行傳遞)。在JavaScript中這是很常見的一個語法特性,但在Java中將一個函數(shù)作為參數(shù)傳遞這卻行不通,好在JDK8的出現(xiàn)打破了Java的這一限制。
2、Lambda 的語法
Lambda 表達(dá)式在Java 語言中引入了一個新的操作符。這個操作符為 “->” , 該操作符被稱為 Lambda 操作符或剪頭操作符。
Lambda 操作符 -> 將 Lambda 分為了兩個部分:
- 左側(cè): 指定了 Lambda 表達(dá)式需要的所有參數(shù)
- 右側(cè): 指定了 Lambda 體,即 Lambda 表達(dá)式要執(zhí)行的功能。
各種情況語法格式說明:
- 無入?yún)?,無返回值:
Runnable r1 = () -> System.out.println("Hello Lambda!");
- 有一個入?yún)ⅲ瑹o返回值:
Consumer<String> con = (x) -> System.out.println(x); Consumer<String> con = x -> System.out.println(x); //只有一個參數(shù),此時參數(shù)的小括號可以省略掉
- 有兩個入?yún)ⅲ⑶矣蟹祷刂?/li>
Comparator<Integer> com = (x, y) -> { System.out.println("函數(shù)式接口"); return Integer.compare(x, y); };
當(dāng) Lambda 體只有一條語句時,return 與大括號都可以省略,Lambda 會自動將操作符右側(cè)的值進(jìn)行返回
Comparator<Integer> com = (x, y) -> Integer.compare(x, y);
Lambda 表達(dá)式的參數(shù)列表的數(shù)據(jù)類型也可以省略不寫,因為JVM編譯器會通過上下文自動推斷出數(shù)據(jù)類型,即“類型推斷”
Comparator<Integer> com = ( Integer x, Integer y) -> { //Integer 類型可以省略
System.out.println("函數(shù)式接口");
return Integer.compare(x, y);
};
類型推斷:Lambda 表達(dá)式中的參數(shù)類型都是由編譯器推斷 得出的。 Lambda 表達(dá)式中無需指定類型,程序依然可以編譯,這是因為 javac 根據(jù)程序的上下文,在后臺推斷出了參數(shù)的類型。 Lambda 表達(dá)式的類型依賴于上下文環(huán)境,是由編譯器推斷出來的。這就是所謂的 “類型推斷”

浙公網(wǎng)安備 33010602011771號