做了這麼久的程序員,你知道爲什麼會有 Lambda 表達式嗎?

Java8 有一些新的特性,今天老顧給大家分享一下關於 Lambda 表達式的由來,一開始感覺 Lambda 可讀性蠻差的,不知道**爲什麼 Java8 會出來這個表達式?**既然大佬們推出來,肯定是有原因的,應該是爲了解決一些問題,那我們就看看解決了什麼問題?

班導想了解一下各個同學的相關情況:

1、來自蘇州的有哪些同學

上面的僞代碼,是不是很簡單,寫一個方法,直接過濾出蘇州地區的學生。

班導又想知道來自北京的有哪些同學,那代碼執行優化一下,可以動態傳地區參數。

2、地區參數化

這樣是不是就解決了,所有地區的查詢問題,把地區作爲一個參數

問題好像得到了解決,突然班導又要知道同學們的年齡分佈。

3、可以查出 20 歲以上的學生

這一次直接到位,把年齡參數化

我們發現因爲班導的兩個需求,根據地區和年齡查找學生,我們程序員提供了兩個方法,filterStudentByArea 和 filterStudentByAge。

我們小夥伴們有沒有發現,此兩個方法裏面的代碼是不是很像,有很多重複的代碼。不過滿足需求就行了,還能接受是吧。

因爲上面是兩個方法,很多小夥伴會想到可以改成一個方法,用 flag 標記查詢的業務。

改爲一個方法,flag 爲 true 表示根據年齡範圍查找學生;flag 爲 false,表示查地區裏面的學生

調用方式

List<Student> areaStudentList = filterStudent(students,"蘇州",0,false);
List<Student> ageStudentList = filterStudent(students,"",20,true);

雖然改造了一個方法,但實現方式比較噁心。

小夥伴們會說那就不要優化了,兩個方法就兩個唄。其實如果需求不變了,這樣也是沒問題的,但如果班導又提出要根據學生成績進行查詢,或又要根據學生的體重、身高等;每增加一個維度都要寫相應的方法,導致很多重複的代碼

作爲一個有上進心的,有追求的程序員,這種方案感覺很變扭,要想個方法解決。突然想到了 JAVA 的設計模式,是不是可以用這個解決啊,我們來看看。

還好我們的小夥伴們知道一點設計模式,那用策略模式進行改造吧

定義一個接口,用來進行過濾的接口,我們可以實現這個接口,去完成不同的需求,如:

上面定義了兩種查詢條件,都是實現了 StudentPredicate 接口,那我們再看看主方法

上面的核心代碼就是 p.test(stu);這個就是查詢條件邏輯實現方法;要查詢某個業務,只需要把相關業務的接口實現傳給這個主方法就行了

上面的方式代碼相對比較優美,如有別的查詢需求,只要實現 StudentPredicate 接口就行了。但這點也是個缺點,每個需求都要去寫相關的接口實現。

爲了解決接口實現太多,可以採用匿名類去解決,再來優化一下

這種方式大大的減少了接口實現類,需要什麼業務需求,直接在調用方法的時候建立匿名類去實現就行了。匿名類的方式,我們的大佬覺得還是不夠簡潔,所以 Java8 中新增了 Lambda 表達式,我們看看。

我們來看看 Lambda 表達式的實現

小夥伴們看看,是不是很簡潔。

每個技術的出現肯定是爲了解決一些問題的,小夥伴們在學習的時候,一定要知道爲什麼,解決什麼問題,這樣會對我們瞭解這個技術點更深入,下一篇老顧再來說說 Lambda 表達式的具體用法,謝謝!!!


“不積跬步,無以至千里”,希望未來的你能:有夢爲馬 隨處可棲!加油,少年!

關注公衆號:「Java 知己」,每天更新Java知識哦,期待你的到來!

  • 發送「1024」,免費領取 30 本經典編程書籍。
  • 發送「Group」,與 10 萬程序員一起進步。
  • 發送「面試」,領取BATJ面試資料、面試視頻攻略。
  • 發送「JavaEE 實戰」,領取《JavaEE 實戰》系列視頻教程。
  • 發送「玩轉算法」,領取《玩轉算法》系列視頻教程。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章