Lambda運算式
當需要啟動一個執行緒去完成任務時,通常會通過 java.lang.Runnable 介面來定義任務內容,并使用java.lang.Thread 類來啟動該執行緒,代碼如下:
public class Demo{
public static void main(String[] args) {
// 匿名內部類
Runnable task = new Runnable() {
@Override
public void run() { // 覆寫重寫抽象方法
System.out.println("多執行緒任務執行中!");
}
};
new Thread(task).start(); // 啟動執行緒
}
}
對于 Runnable 的匿名內部類用法,可以分析出幾點內容:
- Thread 類需要 Runnable 介面作為引數,其中的抽象 run 方法是用來指定執行緒任務內容的核心;
- 為了指定 run 的方法體,需要 Runnable 介面的實作類;
- 為了省去定義一個 RunnableImpl 實作類的麻煩,使用匿名內部類;
- 必須覆寫重寫抽象 run 方法
借助Java 8的全新語法,上述 Runnable 介面的匿名內部類寫法可以通過更簡單的Lambda運算式達到等效:
public class Demo02{
public static void main(String[] args) {
new Thread(() -> System.out.println("多執行緒任務執行中!")).start(); // 啟動執行緒
}
}
這段代碼和剛才的執行效果是完全一樣的,可以在jdk1.8或更高的編譯級別下通過

Lambda運算式的標準格式為:
(引數型別 引數名稱) -> { 代碼陳述句 }
格式說明:
(1)當(形參串列)是空參(),那么括號不能省略
(2)當(形參串列)只有一個形參時,并且型別也可以確定或可以推斷時,可以省略()和資料型別,要省略就一起省略.
(3)當(形參串列)有多個時,而且型別也可以確定或可以推斷時,可以省略資料型別
(4)當{Lambda體}中不止陳述句時,不能省略},并且每一個陳述句還必須加;
(5)當{Lambda體}只有一個陳述句時,可以省略{}和該陳述句的:
(6)當{Lambda體}只有一個陳述句,并且是一個{return 回傳值;}陳述句,那么可以一起省略return和}和這個;
(7)當{Lambda體}如果不止一個陳述句,那么如果函式式介面的抽象方法有回傳值,那么必須有return
四個最基本的函式式介面:
消費型介面Consumer
特點是,它的抽象方法:有參無回傳值

供給型介面 Supplier
特點是,它的抽象方法:無參有回傳值

判斷型介面 Predicate
特點是,它的抽象方法;boolean test(有參)無論你給我什么引數,都是用來判斷條件,結果只有true,false

功能型介面 Function<T,R>:R apply(T t)
特點是,它的抽象方法:有參有回傳值
方法參考和構造器參考
當{Lambda體}只有一句時,并且是通過呼叫一個類或一個物件的方法來完成的,并且函式式介面的抽象方法的形參串列和回傳值型別與你呼叫的這個類或物件的方法的形參串列和回傳值型別要對應,
當{Lambda體}只有一句時,并且是通過創建一個物件來完成的,并且函式式介面的抽象方法的形參串列和回傳值型別與你構造器的形參串列與所創建的物件的型別要對應,
方法參考和構造器參考語法:
類名/物件名::方法名
類名/陣列型別::new

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/108962.html
標籤:Java
