做了這麼久的程式設計師,你知道為什麼會有Lambda表示式嗎?
前言
Java8有一些新的特性,今天老顧給大家分享一下關於Lambda表示式的由來,一開始感覺Lambda可讀性蠻差的,不知道為什麼Java8會出來這個表示式?既然大佬們推出來,肯定是有原因的,應該是為瞭解決一些問題,那我們就看看解決了什麼問題?
案例
班導想了解一下各個同學的相關情況:
1、來自蘇州的有哪些同學
上面的虛擬碼,是不是很簡單,寫一個方法,直接過濾出蘇州地區的學生。
班導又想知道來自北京的有哪些同學,那程式碼執行優化一下,可以動態傳地區引數。
2、地區引數化
這樣是不是就解決了,所有地區的查詢問題,把地區作為一個引數。
問題好像得到了解決,突然班導又要知道同學們的年齡分佈。
3、可以查出20歲以上的學生
這一次直接到位,把年齡引數化。
我們發現因為班導的兩個需求,根據地區和年齡查詢學生,我們程式設計師提供了兩個方法,filterStudentByArea和filterStudentByAge。
我們小夥伴們有沒有發現,此兩個方法裡面的程式碼是不是很像,有很多重複的程式碼。不過滿足需求就行了,還能接受是吧。
改造一下
因為上面是兩個方法,很多小夥伴會想到可以改成一個方法,用flag標記查詢的業務。
改為一個方法,flag為true 表示根據年齡範圍查詢學生;flag為false,表示查地區裡面的學生
呼叫方式
List<Student> areaStudentList = filterStudent(students,"蘇州" ,false);
List<Student> ageStudentList = filterStudent(students,"",20,true);
複製程式碼
雖然改造了一個方法,但實現方式比較噁心。
小夥伴們會說那就不要優化了,兩個方法就兩個唄。其實如果需求不變了,這樣也是沒問題的,但如果班導又提出要根據學生成績進行查詢,或又要根據學生的體重、身高等;每增加一個維度都要寫相應的方法,導致很多重複的程式碼。
作為一個有上進心的,有追求的程式設計師,這種方案感覺很變扭,要想個方法解決。突然想到了JAVA的設計模式,是不是可以用這個解決啊,我們來看看。
策略模式
還好我們的小夥伴們知道一點設計模式,那用策略模式進行改造吧
定義一個介面,用來進行過濾的介面,我們可以實現這個介面,去完成不同的需求,如:
上面定義了兩種查詢條件,都是實現了StudentPredicate介面,那我們再看看主方法
上面的核心程式碼就是p.test(stu);這個就是查詢條件邏輯實現方法;要查詢某個業務,只需要把相關業務的介面實現傳給這個主方法就行了。
上面的方式程式碼相對比較優美,如有別的查詢需求,只要實現StudentPredicate介面就行了。但這點也是個缺點,每個需求都要去寫相關的介面實現。
匿名類
為瞭解決介面實現太多,可以採用匿名類去解決,再來優化一下
這種方式大大的減少了介面實現類,需要什麼業務需求,直接在呼叫方法的時候建立匿名類去實現就行了。匿名類的方式,我們的大佬覺得還是不夠簡潔,所以Java8中新增了Lambda表示式,我們看看。
Lambda表示式
我們來看看Lambda表示式的實現
小夥伴們看看,是不是很簡潔。
總結
每個技術的出現肯定是為瞭解決一些問題的,小夥伴們在學習的時候,一定要知道為什麼,解決什麼問題,這樣會對我們瞭解這個技術點更深入,下一篇老顧再來說說Lambda表示式的具體用法,謝謝!!!