案列:通过颜色筛选苹果
一般代码逻辑写法
public List<Apple> filterApple(List<Apple> apples){
List<Apple> result = new ArrayList<Apple>();
for(Apple apple:apples){
if("green".equals(apple.getColor())){
result.add(apple);
}
}
return result;
}
那么问题来了如果想筛选其他颜色的苹果,就要重新写一个筛选代码,而且这些代码大部分都是重复的。我们也可以修改代码,将颜色作为参数传递过去。但是新的问题又来了,如果想筛选苹果的重量,苹果的种类等等,就要加更多的参数,方法里面还要做多个判断代码又有大部分重复而且维护变的复杂。
使用行为参数化
public List<Apple> filerApple(List<Apple> apples, Predicate<Apple> p){
List<Apple> result = new ArrayList<Apple>();
for (Apple apple:apples){
if(p.test(apple)){
result.add(apple);
}
}
return result;
}
List<Apple> apple1 = filerApple(apples,(Apple apple) -> "red".equals(apple.getColor()));//筛选红苹果
List<Apple> apple2 = filerApple(apples,(Apple apple) -> apple.getWeight()>150);//筛选大于150g的苹果
上面就是通过行为filerApple只是做了筛选的操作,至于筛选什东西则通过行为参数传过来。使代码简洁易读。