java基礎語法大綱
一、Lambda 表達式
1.1.概述:
- 1.
Lambda 是一個匿名函數
,我們可以把 Lambda 表達式理解為是一段可以傳遞的代碼
(將代碼像數據一樣進行傳遞) - 2.使用Lambda 表達式可以寫出更簡潔、更靈活的代碼。作為一種更緊湊的代碼風格,使Java的語言表達能力得到了提升
- 3.Lambda 表達式的本質
就是函數式接口的實例
- 一方面Lambda 表達式作為接口的實現類的對象
- 另一方面Lambda 表達式是一個匿名函數
- 一方面Lambda 表達式作為接口的實現類的對象
1.2.語法:
- 1.在Java 8 語言中引入的一種新的語法元素和操作符
->
,該操作符被稱為 Lambda 操作符或箭頭操作符
。它將 Lambda 分為兩個部分:左側
:指定 Lambda 表達式需要的參數列表
,就是接口中抽象方法的形參列表右側
:指定 Lambda 體,是抽象方法的實現邏輯,就是抽象方法的方法體、即Lambda 表達式要執行的功能
1.3.體會:將冗余的匿名內部類轉Lambda表達式:
a.案例1:實現多線程轉匿名函數:
第1步:實現啟動線程:
- 1.當需要啟動一個線程去完成任務時:
- 首先通過
java.lang.Runnable
接口來定義任務內容 - 然后使用
java.lang.Thread
類來啟動該線程。代碼如下:
- 首先通過
package com.atguigu.fp;public class UseFunctionalProgramming {public static void main(String[] args) {new Thread(new Runnable() {@Overridepublic void run() {System.out.println("多線程任務執行!");}}).start(); // 啟動線程}
}
代碼分析: 對于
Runnable
的匿名內部類用法,可以分析出幾點內容:
Thread
類需要Runnable
接口作為參數,其中的抽象run
方法是用來指定線程任務內容的核心:- 為了指定
run
的方法體,不得不需要Runnable
接口的實現類; - 為了省去定義一個
RunnableImpl
實現類的麻煩,不得不使用匿名內部類; - 必須覆蓋重寫抽象
run
方法,所以方法名稱、方法參數、方法返回值不得不再寫一遍,且不能寫錯;
- 為了指定
- 實際上,似乎只有方法體才是關鍵所在
從匿名類到 Lambda 的轉換舉例:
- 匿名內部類轉Lambda表達式:
b.案例2:TreeSet案例:
c.案例3:比較器Comparator():
- 1.匿名函數類:
- 2.Lambda形式:
- 3.方法應用形式:
二、在6種情況下Lambda 表達式使用:
情況1:無參,無返回值
a.語法:
b.案例:
情況2:Lambda 需要一個參數,但是沒有返回值
a.語法:
b.案例:
情況3:數據類型可以省略,因為可由編譯器推斷得出,稱為“類型推斷”
a.語法:
b.舉例:
情況4:Lambda 若只需要一個參數時,參數的小括號可以省略
a.語法:
b.舉例:
情況5:Lambda 需要兩個或以上的參數,多條執行語句,并且可以有返回值
a.語法:
b.舉例:
情況6:當 Lambda 體只有一條語句時,return 與大括號若有,都可以省略
a.語法:
b.舉例:
類型推斷說明:
- 1.在Lambda 表達式中的
參數類型都是由編譯器推斷得出的
。Lambda表達式中無需指定類型,程序依然可以編譯,這是因為javac 根據程序的上下文,在后臺推斷出了參數的類型
。 - 2.Lambda 表達式的類型依賴于上下文環境,是由編譯器推斷出來的。這就是所謂的“類型推斷”。