行為參數化是用來處理頻繁變更的需求的一種軟件開發模式。拿出一個代碼塊,把它准備好卻不去執行它。這個代碼塊以后可以被程序的其他部分調用,也就是推遲這塊代碼的執行。
行為參數化:讓方法接受多種行為作為參數,並在內部使用,來完成不同的行為。
傳遞代碼,就是將新行為作為參數傳遞給方法。但在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)的方法體