您好,我是湘王,這是我的博客園,歡迎您來,歡迎您再來~ 從之前的Lambda表達式的演變過程可以知道,Lambda表達式其實是一個對匿名內部類的簡化過程:去掉了多餘的語法修飾,只保留最最核心的部分。在Java中類似這種使用匿名內部類寫代碼的場景非常多,比如Runnable介面,就是典型的最好使用La ...
您好,我是湘王,這是我的博客園,歡迎您來,歡迎您再來~
從之前的Lambda表達式的演變過程可以知道,Lambda表達式其實是一個對匿名內部類的簡化過程:去掉了多餘的語法修飾,只保留最最核心的部分。在Java中類似這種使用匿名內部類寫代碼的場景非常多,比如Runnable介面,就是典型的最好使用Lambda表達式的地方。例如這樣的代碼:
可以清除地看到代碼的簡化過程。
所以Lambda表達式的特點在於:
1、匿名:像匿名函數一樣,沒有名字,只有代碼塊
2、函數:基於介面函數執行,而不是類
3、行為:傳遞行為,而非封裝代碼
很多剛開始學習Lambda表達式的人之所以覺得比較難適應,是因為沒有弄明白完整的匿名函數是如何進行簡化的這個過程。我個人的學習經驗是,只要腦子裡時時記著:Lambda是對匿名函數的簡化,就會容易理解一些了。
Java8除了將匿名內部類改造成了Lambda表達式之外,還提供了一個註解,叫做@FunctionalInterface。它專門用來自定義需要的函數式介面。例如:
它可以這麼來用:
FruitInterface face = (t) -> System.out.println("這是自定義的函數式編程介面");
省略了實例化的類名、省略了方法名、省略了參數類型,只顯示方法的參數和方法體。自然過渡到Lambda表達式的建議:
這是Java提供的註解。除了這個註解以外,為了方便碼農開發,Java也預定義了一堆可以直接拿來就用的函數式介面,常用的都列到這個表裡了:
什麼是供給型呢?意思就是沒有消費卻能提供輸出(消費指的是有沒有參數)。例如之前說的Runnable就是一個供給型介面,可以簡化成:
() -> System.out.println("這是run()方法裡面的列印語句");
再比如預測型,可能是:
所以,先把Java預定義的函數式介面弄熟也是一個不錯的開始。
之所以花這麼多篇幅來說Lambda表達式和函數式介面,是因為這玩意確實是比較難理解。不管對於剛入門的新手,還是有了一些開發經驗的老手,都是如此。所以,新人不必覺得為啥自己學不會。不止是新人,很多有多年開發經驗的人都容易卡在這裡,這也是我為啥寧可多花點篇幅反覆啰嗦的原因。
至於方法引用和構造器引用,並不是什麼高大上的技術,只要把Lambda表達式和函數式編程的底層原理搞懂了,那玩意分分鐘學會。
感謝您的大駕光臨!咨詢技術、產品、運營和管理相關問題,請關註後留言。歡迎騷擾,不勝榮幸~