1. 程式人生 > 程式設計 >做了這麼久的程式設計師,你知道為什麼會有Lambda表示式嗎?

做了這麼久的程式設計師,你知道為什麼會有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表示式的具體用法,謝謝!!!