1. 程式人生 > >java8之行為引數化(二)

java8之行為引數化(二)

      上一章講到我們可以使用策略模式使得變動的程式碼塊更具有擴充套件性,實現引數化。可是,如果變動的程式碼塊只使用一次呢,也就是說,我們僅用一次介面的實現類呢?這時,我們會發現,為介面編寫實現類簡直就是浪費。顯然,匿名類此時就派上用場了。

// [Apple{color='green', weight=155}]
List<Apple> heavyApples2 = filter(inventory, new ApplePredicate(){
   public boolean test(Apple apple){
      return 
apple.getWeight() > 150; } }); System.out.println(heavyApples2);
怎麼樣,是不是覺得看起來容易多了?但這都是java8之前的東西了,java8出現之後,更簡便的方法變橫空出世了。

在呼叫部分,我們只需寫呼叫方法即可,系統會自動將方法注入到介面的實現方法內部。

public static boolean isHeavyApple(Apple apple) {
    return apple.getWeight() > 150;
}
// [Apple{color='green', weight=155}]
List<Apple> heavyApples = filterApples(inventory, FilteringApples::isHeavyApple); System.out.println(heavyApples);
是不是感覺特別簡潔?別急,還有更簡潔的,我們可以不用寫函式,直接採用匿名函式,也就是Lambda。

// [Apple{color='green', weight=155}]
List<Apple> heavyApples2 = filterApples(inventory, (Apple a) -> a.getWeight() > 150
); System.out.println(heavyApples2);
到現在為止,想想我們要實現行為引數化,需要幾個步驟呢?

1、函式定義。

2、函式的引數為一個介面,定義這個介面

3、呼叫這個函式。

其實,這個介面被稱為斷言,在java8中已經定義好了Predicate

我們要做的就是定義一個函式,並在呼叫這個函式時,將lambda傳進斷言裡即可。