摘要:行為參數化的好處在于我們可以把過濾的邏輯與應用過濾的行為解耦。實戰第二章通過行為參數化傳遞代碼讀書筆記這是我第一篇文章,歡迎加入咖啡館的春天。
應對不斷變化的需求
在實際的工作中我們會將現實問題抽象成對象并對其進行處理,比如需要對一堆顏色和重量不同的蘋果進行過濾分類。
1、蘋果實體類
public class Apple { // 顏色 private String color; // 重量 private Integer weight; // Getter and Setter }
2、過濾方法
public static Listfilter(List appleList, String color, int weight) { // 符合條件的蘋果集合 List result = new ArrayList<>(); for (Apple apple : appleList) { // 如果顏色和重量符合條件就存入 if (color.equalsIgnoreCase(apple.getColor()) && weight == apple.getWeight()) { result.add(apple); } } return result; }
通過定制過濾方法,比如后期蘋果可能會有其他的屬性,是否成熟、產地等。我們可以在過濾方法的入參加上對應的屬性并在內部進行判斷。這就是通過修改過濾方法來 應對不斷變化的需求。但這樣有其局限性,如果需求不斷地更改,那么就需要重寫很多相似的方法。這違背了
DRY(Don"t Repeat Yourself)
的軟件工程原則。
行為參數化我們其實可以通過標準建模來定義一個過濾接口,讓其比重寫很多次過濾方法更好地 應對不斷變化的需求。
1、建立蘋果謂詞接口
// predicate:謂詞,即一個返回 boolean 值的接口 public interface ApplePredicate { boolean test(Apple apple); }
2、運用策略模式思想來構建具體算法(策略)實現
public class AppleColorPredicate implements ApplePredicate { @Override public boolean test(Apple apple) { // 選出綠色的蘋果 return "green".equalsIgnoreCase(apple.getColor()); } } public class AppleWeightPredicate implements ApplePredicate { @Override public boolean test(Apple apple) { // 選出重量大于1的蘋果 return 1 < apple.getWeight(); } }
策略模式作為一種軟件設計模式,指對象有某個行為,但是在不同的場景中,該行為有不同的實現算法。
定義了一族算法(業務規則);
封裝了每個算法;
這族的算法可互換代替(interchangeable)—— 策略模式 - 維基百科,自由的百科全書
我們可以將 AppleColorPredicate 和 AppleWeightPredicate 看作是 過濾方法 的不同行為,需要 過濾方法 接收 ApplePredicate 對象對蘋果進行過濾。這就是 行為參數化:讓方法接收多種行為(或策略)作為參數,并在內部使用,來完成不同的行為。
1、修改過濾方法讓其能夠接收蘋果謂詞接口對象
public static Listfilter(List appleList, ApplePredicate applePredicate) { // 符合條件的蘋果集合 List result = new ArrayList<>(); for (Apple apple : appleList) { // 如果符合條件就存入 if (applePredicate.test(apple)) { result.add(apple); } } return result; }
2、調用過濾方法進行過濾
public class Main { public static void main(String[] args) { ListappleList = new ArrayList<>(); Apple apple = new Apple(); apple.setColor("red"); apple.setWeight(1); appleList.add(apple); apple = new Apple(); apple.setColor("green"); apple.setWeight(2); appleList.add(apple); List result = filter(appleList, new AppleWeightPredicate()); } }
result 中就會只有重量大于1的蘋果集合了。行為參數化 的好處在于我們可以把過濾的邏輯 boolean test() 與應用過濾的行為 public static List
然而按照以上方式使用 ApplePredicate 依然有一個問題,那就是我們還是得不斷地新增 ApplePredicate 的實現。本質上只是把重寫過濾方法的代價轉移到了新增謂詞實現上。這個時候我們可以換一個思路出發,使用 匿名類 來隨用隨建謂詞實現。
使用匿名類實現謂詞接口
Listresult = filter(appleList, new ApplePredicate() { @Override public boolean test(Apple apple) { // 選出綠蘋果且重量為2 return "green".equalsIgnoreCase(apple.getColor()) && 2 == apple.getWeight(); } });
現在,我們只需要每次去匿名實現謂詞接口就行,然而這樣的寫讓人覺得很臃腫,而且看起來很讓人費解。接下來看看 Lambda 是怎么讓其變得簡潔又友好的。
通過 Lambda 簡化匿名實現
Listresult = filter(appleList, (Apple apple1) -> "green".equalsIgnoreCase(apple1.getColor()) && 2 == apple1.getWeight());
是不是簡潔得有點看不懂了?沒關系,先細細品味,下一章我們會詳細了解 Lambda。
我們還可以進一步抽象。目前 ApplePredicate 還只適用于蘋果,而我想要其他對象進行過濾呢?可以使用泛型來定義需要處理的對象。
1、修改 ApplePredicate 成 Predicate
public interface Predicate{ boolean test(T t); }
2、修改過濾方法
public staticList filter(List list, Predicate predicate) { // 符合條件的集合 List result = new ArrayList<>(); for (T t : list) { // 如果符合條件就存入 if (predicate.test(t)) { result.add(t); } } return result; }
這樣我們就能將過濾方法用在其他對象上了。下一章我們會更加深入地理解 Lambda 是什么,能干什么。
Java 8 實戰 第二章 通過行為參數化傳遞代碼 讀書筆記
這是我第一篇文章,歡迎加入咖啡館的春天(338147322)。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/67606.html
摘要:但是到了第二天,他突然告訴你其實我還想找出所有重量超過克的蘋果。現在,農民要求需要篩選紅蘋果。那么,我們就可以根據條件創建一個類并且實現通過謂詞篩選紅蘋果并且是重蘋果酷,現在方法的行為已經取決于通過對象來實現了。 通過行為參數化傳遞代碼 行為參數化 在《Java8實戰》第二章主要介紹的是通過行為參數化傳遞代碼,那么就來了解一下什么是行為參數化吧。 在軟件工程中,一個從所周知的問題就是,...
摘要:比如說,有個應用程序是幫助果農了解自己的庫存。果農可能想有一個查找庫存中所有綠色蘋果的功能。又過了兩天,果農又跑過來補充道要是我可以找出所有既是綠色,重量也超過克的蘋果,那就太棒了。此外,類似的新功能實現起來還應該很簡單,而且易于長期維護。 1 需求說明 在軟件工程中,一個眾所周知的問題就是,不管你做什么,用戶的需求肯定會變。比如說,有個應用程序是幫助果農了解自己的庫存。果農可能想有一...
摘要:自定義函數式接口我們在前面例子中實現的蘋果篩選接口就是一個函數式接口定義如下,正因為如此我們可以將篩選邏輯參數化,并應用表達式僅包含一個抽象方法,依照定義可以將其視為一個函數式接口。 Lambda 表達式是 java 8th 給我們帶來的幾個重量級新特性之一,借用 lambda 表達式可以讓我們的程序設計更加簡潔。最近新的項目摒棄了 6th 版本,全面基于 8th 進行開發,本文將探討...
摘要:不存在則實例化一個新的對象并將它以指定的名稱存儲到指定的域范圍中。 什么是javaBean JavaBean就是一個普通的java類,也稱之為簡單java對象--POJO(Plain Ordinary Java Object),是Java程序設計中一種設計模式,是一種基于 Java 平臺的軟件組件思想 JavaBean遵循著特定的寫法,通常有以下的規則: 有無參的構造函數 成...
摘要:新特性總覽標簽本文主要介紹的新特性,包括表達式方法引用流默認方法組合式異步編程新的時間,等等各個方面。還有對應的和類型的函數連接字符串廣義的歸約匯總起始值,映射方法,二元結合二元結合。使用并行流時要注意避免共享可變狀態。 Java8新特性總覽 標簽: java [TOC] 本文主要介紹 Java 8 的新特性,包括 Lambda 表達式、方法引用、流(Stream API)、默認方...
閱讀 895·2021-10-13 09:39
閱讀 1485·2021-10-11 10:57
閱讀 2597·2019-08-26 13:53
閱讀 2542·2019-08-26 12:23
閱讀 3694·2019-08-23 18:30
閱讀 3754·2019-08-23 18:08
閱讀 2527·2019-08-23 18:04
閱讀 2963·2019-08-23 16:28