只有光頭才能變強。java
文本已收錄至個人GitHub倉庫,歡迎Star:https://github.com/ZhongFuCheng3y/3ygit
中秋去了躺上海,在外灘上打了個卡:github
緊接着學了一下Java的函數式編程,給你們整理了一下,一塊兒學習!編程
以前寫Optional這個類的時候,簡單說了一下Lambda是怎麼用的,這裏再跟你們一塊兒回顧一下,Lambda的語法是這樣的:ide
以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
註解(標記着這個接口只有一個抽象方法)優化
從上面的代碼例子能夠看出,咱們使用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的時候,還可能會發現一種比較奇怪的寫法,例以下面的代碼:
// 方法引用寫法 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多篇原創技術文章、海量視頻資源、精美腦圖,關注便可獲取!
以爲個人文章寫得不錯,點贊!