1、Lambda的介紹
Lambda的作用是替代一個匿名函數,由於匿名函數有許多冗餘代碼,即降低了編寫效率,也影響閱讀,於是jdk8引進了Lambda表達式,用於簡化書寫。
2、問題引入
在Java多線程這篇博客中,我介紹了兩種使用Runnable接口創建線程的方法。其中一種就是自定義類實現Runnable接口,另外一種就是使用匿名函數。這兩種方法本質上是一樣的:
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("hello Lambda");
}
}).start();
可能有人覺得這樣就挺簡潔了,但是一對比Lambda表達式,就會發現其實有一些代碼時沒有必要的
new Thread(
() -> System.out.println("hello Lambda")
).start();
這樣,問題就出來了:
- 爲了指定run()的方法體,必須編寫Runnable接口的實現類;
- 或者爲了省去定義一個Runnable實現類的麻煩,不得不使用匿名內部類;
- 必須覆蓋重寫抽象
run
方法,所以方法名稱、方法參數、方法返回值不得不再寫一遍,且不能寫錯; - 但是實際上,真正有用的代碼只有方法體代碼!
3、 Lambda標準格式
Lambda省去面向對象的條條框框,格式由3個部分組成:
- 一個括號(參數列表)
- 一個箭頭
- 一段代碼(方法體)
Lambda表達式的標準格式爲:
(參數類型 參數名稱) -> { 代碼語句 }
格式說明:
- 小括號內的語法與傳統方法參數列表一致:無參數則留空;多個參數則用逗號分隔。
- ->是新引入的語法格式,代表指向動作。
- 大括號內的語法與傳統方法體要求基本一致。
4、Lambda實戰
4.1、無參無返回值的Lambda
定義一個兒子Son接口,內只能含唯一的抽象方法,且無參數、無返回值:(爲什麼是唯一,請看下一篇博客函數式接口)
public interface Son {
void study();
}
定義一個父親Father類,催促兒子去學習啦:
public class Father {
private static void urge(Son son) {
son.study();
}
}
結果輸出:
public static void main(String[] args) {
urge(() -> {
System.out.println("去學習了");
});
}
4.2、有參有返回值的Lambda
定義一個計算器Calculator接口,內含唯一的抽象方法:
public interface Calculator {
int calc(int a, int b);
}
在下面的代碼中,請使用Lambda的標準格式調用invokeCalc
方法,完成120和130的相加計算:
public class Demo1 {
private static void invokeCalc(int a, int b, Calculator calculator) {
int result = calculator.calc(a, b); // 將參數a,b傳遞給接口的抽象方法calc
System.out.println("結果是:" + result);
}
}
結果輸出:
public static void main(String[] args) {
invokeCalc(120, 130, (int a, int b) -> {
return a + b;
});
}
5、Lambda的省略格式
可推導即可省略!
public static void main(String[] args) {
invokeCalc(120, 130, (a, b) -> a + b);
}
省略寫法的規則:
- 小括號內參數的類型可以省略;
- 如果小括號內有且僅有一個參,則小括號可以省略;
- 如果大括號內有且僅有一個語句,則無論是否有返回值,都可以省略大括號、return關鍵字及語句分號。
有錯誤的地方敬請指出!覺得寫得可以的話麻煩給個贊!歡迎大家評論區或者私信交流!