Java8-Lambda表達式

什么是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表達式 | 火堯

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容