重構代碼,用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方法對其進行構造。
工廠模式:這個比較複雜,與工廠方法所需參數數量有關係。