ps:例子为筛选苹果
1.1 定义接口
public interface ApplePredicate{
boolean test (Apple apple);
}
1.2 根据条件实现该接口(重量或颜色)
public class AppleHeavyWeightPredicate implements ApplePredicate{
public boolean test(Apple apple){
return apple.getWeight() > 150;
}
}
public class AppleGreenColorPredicate implements ApplePredicate{
public boolean test(Apple apple){
return "green".equals(apple.getColor()); //筛选绿色苹果
}
}
1.3 添加filter筛选方法
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;
}
filterApples该方法中只要给它不同的ApplePredicate实现接口就能做出不同的筛选。筛选的行为作为了参数。
1.4 利用匿名内部类优化:(还是显的啰嗦)
List<Apple> redApples = filterApples(inventory, new ApplePredicate() {
public boolean test(Apple apple){
return "red".equals(apple.getColor());
}
});
1.5 利用Lambda表达式优化:
List<Apple> result =
filterApples(inventory, (Apple apple) -> "red".equals(apple.getColor()));
但是只能筛选苹果。
方法优化
2.1 将list类型抽象:(将接口中的Apple抽象化)
public interface Predicate<T>{
boolean test(T t);
}
2.2 修改筛选方法:(引入T)
public static <T> List<T> filter(List<T> list, Predicate<T> p){
List<T> result = new ArrayList<>();
for(T e: list){
if(p.test(e)){
result.add(e);
}
}
return result;
}
例:
List<Apple> redApples = filter(inventory, (Apple apple) -> "red".equals(apple.getColor()));
List<Integer> evenNumbers = filter(numbers, (Integer i) -> i % 2 == 0);
总结:
行为参数化,就是一个方法
接受
多个不同的行为作为参数,并在内部使用它们,
完成
不
同行为的能力。
行为参数化可让代码更好地适应不断变化的要求,减轻未来的工作量。
传递代码,就是将新行为作为参数传递给方法。但在
Java 8
之前这实现起来很
啰
嗦。为接
口声明许多只用一次的实体类而造成的
啰
嗦代码,在
Java 8
之前可以用匿名类来减少。
Java API
包含很多可以用不同行为进行参数化的方法,包括排序、线程和
GUI
处理。
该文章的所有例子出自java8,想要学习更多请购买正版书籍