如何改造老舊代碼

重構代碼,用Lambda表達式取代匿名類

由於Lambda可以看做是函數式接口的實例,因此,只能將實現了單一抽象方法的匿名類轉換爲Lambda表達式。

注意事項:

①匿名類和Lambda表達式中的this和super的含義是不同的。在匿名類中,this代表的是類自身,但是在Lambda中,它代表的是包含類。

②匿名類可以屏蔽包含類的變量,而Lambda表達式不能屏蔽,通俗來講就是匿名類可以覆蓋包含類同名、同類型變量,而Lambda表達式則不能覆蓋。

③在涉及重載的上下文裏,將匿名類轉換爲Lambda表達式可能導致最終的代碼更加晦澀。因爲Lambda只要讓其方法簽名與接口方法保持一致即可,這就導致了同一個Lambda可以適用於好幾個接口,而匿名類則不會出現這種情況,因爲匿名類的類型是在初始化時確定的,而Lambda的類型取決於它的上下文。

用方法引用重構Lambda表達式

使用JAVA8 API提供的輔助類,然後再借用方法名,這種組合往往能更直觀地表達代碼的意圖。

用Stream API重構命令式的數據處理

建議將所有使用迭代器處理模式處理集合的代碼都轉換成Stream API的方式。

Stream API能更清晰地表達數據處理管道的意圖,同時通過短路和延遲載入、計算機的多核架構可以進行優化。

常用的方式有2種:有條件的延遲執行和環繞執行。

Lambda表達式對設計模式的影響

策略模式:無需聲明新的類來實現不同的策略,可以直接通過傳遞Lambda表達式就能達到同樣的目的。

模板方法:想要插入的不同算法組件可以通過Lambda表達式或者方法引用的方式實現。

觀察者模式:如果觀察者邏輯比較複雜,則建議繼續使用類形式,而不是Lambda表達式。

責任鏈模式:使用andThen方法對其進行構造。

工廠模式:這個比較複雜,與工廠方法所需參數數量有關係。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章