上一章讲到我们可以使用策略模式使得变动的代码块更具有扩展性,实现参数化。可是,如果变动的代码块只使用一次呢,也就是说,我们仅用一次接口的实现类呢?这时,我们会发现,为接口编写实现类简直就是浪费。显然,匿名类此时就派上用场了。
// [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传进断言里即可。