? ? ??
目錄
一、面向對象的處理方法
二、函數式編程的處理方法
先使用匿名內部類:
lambda改造:
lambda改造規則
示例:
三、補充:函數式接口
????????大家好,我是jstart千語。今天總結一下lambda表達式。lambda表達式在后面的streamAPI和mybatis-plus都用得非常多。是很有必要學習的。
? ? ? ? 說白了,lambda表達式就是簡化函數式接口的匿名內部類的書寫。
? ? ? ? 什么是函數式接口?就是只有一個抽象方法的接口。
? ? ? ? 什么是匿名內部類?就是在實參中書寫內部類,傳遞給方法的形參。
?lambda表達式是函數式編程的產物,與我們面向對象編程不同。所以他們的實現方式也會不同。我會從面向對象的方式講起。
Lambda 是一個匿名函數,我們可以把 Lambda 表達式理解為是一段可以傳遞的代碼,它可以寫出更簡潔、更靈活的代碼,作為為一種更緊湊的代碼風格,使 Java 語言表達能力得到了提升。
?
一、面向對象的處理方法
對于使用不同的工具來發送消息的功能,如果是使用面向對象的思想,需要先定義一個接口,然后讓不同的工具來實現這個接口,并重寫它的抽象方法,例如:
接口:
public interface sendMessage {void send();
}
?Email實現類:
public class Email implements sendMessage {@Overridepublic void send() {System.out.println("use email send message");}
}
phone實現類:
public class phone implements sendMessage {@Overridepublic void send() {System.out.println("use phone send message");}
}
具體運行的代碼:
public class Main {public static void main(String[] args) {sendMessage email = new Email();//創建email的實例email.send(); //調用實現類的方法}}
輸出:
總結:
? ? ? ? 顯然,如果使用面向對象的思想,要先自己寫實現類,然后重寫方法,然后創建對象,最好再調用方法。相對來說比較麻煩,特別是某種情況只用一次的時候。
二、函數式編程的處理方法
這是一種簡化代碼的一種書寫風格,可以直接將接口的具體實現寫在lambda表達式里,不需要再進行實例化接口、創建對象、調用方法。
比如基于上述的例子,我再補充一個使用WX來發送消息的實現:
先使用匿名內部類:
public static void main(String[] args) {message(new SendMessage() {@Overridepublic void send() {System.out.println("use wx send message");}});}public static void message(SendMessage sendMessage) {sendMessage.send();}
lambda改造:
public static void main(String[] args) {message(() -> {System.out.println("use wx send message");});}public static void message(SendMessage sendMessage) {sendMessage.send();}
lambda改造規則
改造規則遵循:可推導可省略的思想。也就是說如果可以由java推導出來的就可以省略。
具體如下:
- 從接口名到方法名都可以省略,也就是從new...到方法名都可以省略,參數和方法體之間用 -> 連接。
- 參數類型可以省略不寫
- 如果只有一個參數,()可以省略;如果參數不止一個,那么()就不能省略,只能省略參數類型
- 如果方法體只有一行,{}可以省略、return可以省略,方法體內的 ;可以省略
示例:
public static void main(String[] args) {String result = message("李雷","hello",new SendMessage(){@Overridepublic String send(String user, String message) {System.out.println("send " + message + " to " + user);return "success";}});System.out.println("result: " + result);}public static String message(String user,String message,SendMessage sendMessage) {return sendMessage.send(user, message);}
lambda表達式:
public static void main(String[] args) {String result = message("李雷","hello",(user, message) -> {System.out.println("send " + message + " to " + user);return "success";});System.out.println("result: " + result);}public static String message(String user,String message,SendMessage sendMessage) {return sendMessage.send(user, message);}
輸出:
三、補充:函數式接口
函數式接口就是指只有一個抽象方法的接口,可以使用@FunctionalInterface來標記。
- 不加這個注解,只要接口里面只有一個方法,那這個接口也是函數式接口
- 加了這個注解,如果接口里面不止一個抽象方法,會報編譯錯誤。
- 實際使用中,還是添加這個注解,因為這樣可以做到顯式地聲明,更清楚地知道這個接口的使用意圖。