《Java 8 實戰》(一)——通過行為參數化傳遞代碼


行為參數化是用來處理頻繁變更的需求的一種軟件開發模式。拿出一個代碼塊,把它准備好卻不去執行它。這個代碼塊以后可以被程序的其他部分調用,也就是推遲這塊代碼的執行。

行為參數化:讓方法接受多種行為作為參數,並在內部使用,來完成不同的行為。

傳遞代碼,就是將新行為作為參數傳遞給方法。但在java 8之前實現起來很啰嗦,為借口生命許多只用一次的實體類而造成的啰嗦代碼,在java 8之前可以用匿名類來減少。但java 8后,可以使用Lamda。

package lamdainaction.chap1;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class FilteringApples {

    public static void main(String[] args) {
        List<Apple> inventory = Arrays.asList(new Apple(80, "green"),
                                            new Apple(155, "green"),
                                            new Apple(120, "red"));
        
        List<Apple> result1 = filterApples1(inventory);
        System.out.println(result1);
        
        List<Apple> result2 = filterApples2(inventory);
        System.out.println(result2);
        
        
        List<Apple> result3 = filterApples(inventory, new AppleColorPredicate());
        System.out.println(result3);
        
        List<Apple> result4 = filterApples(inventory, new AppleWeightPredicate());
        System.out.println(result4);
        
        List<Apple> result5 = filterApples(inventory, new ApplePredicate(){

            @Override
            public boolean test(Apple apple) {
                // TODO Auto-generated method stub
                return "red".equals(apple.getColor());
            }
            
        });
        System.out.println(result5);


     
List<Apple> result6 = filterApples(inventory, Apple apple -> "red".equals(apple.getColor());

System.out.println(result6);

    }
    
    public static List<Apple> filterApples1(List<Apple> inventory) {
        List<Apple> result = new ArrayList<>();
        for (Apple apple : inventory) {
            if ("green".equals(apple.getColor())) {
                result.add(apple);
            }
        }
        return result;
    }
    
    public static List<Apple> filterApples2(List<Apple> inventory) {
        List<Apple> result = new ArrayList<>();
        for (Apple apple : inventory) {
            if (apple.getWeight() > 150 ) {
                result.add(apple);
            }
        }
        return result;
    }
    
    public static List<Apple> filterApples(List<Apple> inventory, ApplePredicate p) {
        List<Apple> result = new ArrayList<>();
        for (Apple apple : inventory) {
            if (p.test(apple)) {
                result.add(apple);
            }
        }
        return result;
    }

}

interface ApplePredicate {
    boolean test(Apple apple);
}

class AppleColorPredicate implements ApplePredicate {

    @Override
    public boolean test(Apple apple) {
        
        return "green".equals(apple.getColor());
    }
    
}

class AppleWeightPredicate implements ApplePredicate {

    @Override
    public boolean test(Apple apple) {
        
        return apple.getWeight() > 150;
    }
    
}
class Apple {
    private int weight;
    private String color;
    
    public Apple(int weight, String color) {
        this.setWeight(weight);
        this.setColor(color);
    }

    public int getWeight() {
        return weight;
    }

    public void setWeight(int weight) {
        this.weight = weight;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }
    
    public String toString() {
        return "Apple{" + "color='" + color + "', weight=" + weight +"}";
    }
    
}

謂詞(predicate):一個返回boolean值的函數。例如蘋果,需要根據Apple的某些屬性(它是綠色的嗎,它的重量超過150g嗎)來返回一個boolean值。

Lamda:

List<Apple> result6 = filterApples(inventory, Apple apple -> "red".equals(apple.getColor());

-> 前的 Apple apple 是ApplePredicate.test(Apple apple)中的參數
-> 后的 "red".equals(apple.getColor()) 是ApplePredicate.test(Apple apple)的方法體

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM