Lambda的使用前提:
1、使用lambda必須具有接口,且要求接口中有且僅有一個抽象方法。
無論是JDK內置的Runnable、comparator接口還是自定義的接口,只有當接口中的抽象方法存在且唯一時纔可以使用Lambda
2、使用Lambda必須具有上下文推斷
也就是方法的參數活局部變量類型必須爲Lambda對應的接口類型,才能使用 Lambda作爲該接口的實例
按照Java8函數式接口的定義,其只能有一個抽象方法,否則就不是函數時接口,就無法用Lambda表達式。
可以使用@FunctionalInterface標註函數式接口,在編譯時提前發現錯誤。
有且僅有一個抽象方法的接口,稱爲“函數式接口”
前面的一對小括號,指run方法的參數括號,代表不需要任何條件
中間的一個箭頭表示將前面的參數傳遞給後面的代碼;
後面的輸出語句是業務邏輯代碼。
lambda表達式的標準格式,由三部分組成,
a.一些參數
b.一個箭頭
c.一段代碼
格式:
(參數列表) -> {一些重發方法的代碼};
解釋說明格式:
():接口中抽象方法的參數列表,沒有參數就不寫,多個參數使用逗號分隔
->:傳遞的意思,把參數傳遞給方法體,就是傳遞給大括號
{}:重寫接口的抽象方法的方法體
例子:
//使用匿名內部類的方式實現多線程
new Thread(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "hello");
}
}).start();
//使用lambda表達式實現多線程
//括號是run方法的參數,意思是把括號中的參數傳到大括號的輸出語句
new Thread(() ->{
System.out.println(Thread.currentThread().getName() + "hello");}).start();
//優化lambda
new Thread(() -> System.out.println(Thread.currentThread().getName())).start();
Lambda表達式是可推到可省略的,凡是根據上下文推導出來的內容,可以省略書寫,可以省略的內容:
1、(參數列表):括號中參數列表的數據類型可以省略不寫
2、(參數類型):括號中的參數如果只有一個,那麼類型和()都可以省略
3、(一些代碼):如果()中的代碼只有一行,無論是否有返回值,都可以省略"()"、“return”、“分號”
注意:如果需要省略以上三個符號,這三個必須都要省略
簡化表達式例子:
首先創建一個接口,定義一個包含a,b兩個參數的方法calc,再使用匿名內部類重寫calc
public static void main(String[] args) {
invkoe(10, 20, new Calcuator() {
@Override
public int calc(int a, int b) {
return a+b;
}
});
invkoe(10,20,(int a,int b) -> {return a+b;});
//簡化lambda方法
invkoe(10,20,(a,b) -> a+b);
}
public static void invkoe(int a,int b,Calcuator c){
int sum = c.calc(a,b);
System.out.println(sum);
}