前言
只有光頭才能變強。
文字已收錄至我的GitHub倉庫,歡迎Star:github.com/ZhongFuChen…
中秋去了躺上海,在外灘上打了個卡:
緊接著學了一下Java的函數語言程式設計,給大家整理了一下,一起學習!
一、Lambda用法
之前寫Optional這個類的時候,簡單說了一下Lambda是怎麼用的,這裡再跟大家一起回顧一下,Lambda的語法是這樣的:
以Lambda語法建立執行緒和匿名內部類建立執行緒的區別(顯然程式碼少了很多!):
public static void main(String[] args) {
// 用匿名內部類的方式來建立執行緒
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("公眾號:Java3y---關注我!");
}
});
// 使用Lambda來建立執行緒
new Thread(() -> System.out.println("公眾號:Java3y---關注我!"));
}
複製程式碼
使用Lambda表示式,實際就是建立出該介面的例項物件。
圖示;Runnable介面來舉例:
使用Labmda表示式需要函數語言程式設計介面,比如在Runnable介面上我們可以看到@FunctionalInterface
註解(標記著這個介面只有一個抽象方法)
1.1 函數語言程式設計介面
從上面的程式碼例子可以看出,我們使用Lambda表示式建立執行緒的時候,並不關心介面名,方法名,引數名。我們只關注他的引數型別,引數個數,返回值。
JDK原生就給我們提供了一些函數語言程式設計介面方便我們去使用,下面是一些常用的介面:
簡單說明一下:
- 表格中的一元介面表示只有一個入參,二元介面表示有兩個入參
Demo:
// Consumer 一個入參,無返回值
Consumer<String> consumer = s-> System.out.println(s);
consumer.accept("Java3y");
// Supplier 無入參,有返回值
Supplier<String> supplier = () -> "Java4y";
String s = supplier.get();
System.out.println(s);
//.....
複製程式碼
使用Lambda時,要記住的就兩點:
- Lambda返回的是介面的例項物件
- 有沒有引數、引數有多少個、需不需要有返回值、返回值的型別是什麼---->選擇自己合適的函式式介面
1.2 方法引用
在學Lambda的時候,還可能會發現一種比較奇怪的寫法,例如下面的程式碼:
// 方法引用寫法
Consumer<String> consumer = System.out::println;
consumer.accept("Java3y");
複製程式碼
如果按正常Lambda的寫法可能是這樣的:
// 普通的Lambda寫法
Consumer<String> consumer = s -> System.out.println(s);
consumer.accept("Java3y");
複製程式碼
顯然使用方法引用比普通的Lambda表示式又簡潔了一些。
如果函式式介面的實現恰好可以通過呼叫一個方法來實現,那麼我們可以使用方法引用
方法引用又分了幾種:
- 靜態方法的方法引用
- 非靜態方法的方法引用
- 建構函式的方法引用
方法引用Demo:
public class Demo {
public static void main(String[] args) {
// 靜態方法引用--通過類名呼叫
Consumer<String> consumerStatic = Java3y::MyNameStatic;
consumerStatic.accept("3y---static");
//例項方法引用--通過例項呼叫
Java3y java3y = new Java3y();
Consumer<String> consumer = java3y::myName;
consumer.accept("3y---instance");
// 構造方法方法引用--無引數
Supplier<Java3y> supplier = Java3y::new;
System.out.println(supplier.get());
}
}
class Java3y {
// 靜態方法
public static void MyNameStatic(String name) {
System.out.println(name);
}
// 例項方法
public void myName(String name) {
System.out.println(name);
}
// 無參構造方法
public Java3y() {
}
}
複製程式碼
結果如下:
最後
Lambda雖然程式碼看起來是簡潔,但是如果複雜的話還是比較難看明白的。
在學習Lambda的時候,首先我們得知道有哪些常用函數語言程式設計介面,這些函數語言程式設計介面的有什麼區別(引數個數、返回值型別)
Lambda表示式返回的是介面物件例項,如果函式式介面的實現恰好可以通過呼叫一個方法來實現,那麼我們可以使用方法引用來替代Lambda表示式
最後再完整舉個例子:
// Supplier是一個無入參帶返回的值的函數語言程式設計介面
// () -> new Java3y()這整句Lambda表示式,返回的是Supplier介面的例項。從Lambda表示式可以看出無引數,帶返回值
Supplier<Java3y> supplier = () -> new Java3y();
// 由於這個“() -> new Java3y()”Lambda表示式可以通過呼叫一個方法就實現了,那麼我們可以優化成方法引用
Supplier<Java3y> supplier2 = Java3y::new;
複製程式碼
樂於輸出乾貨的Java技術公眾號:Java3y。公眾號內有200多篇原創技術文章、海量視訊資源、精美腦圖,關注即可獲取!
覺得我的文章寫得不錯,點贊!