java8之行为参数化(二)

来源:互联网 发布:淘宝如何做展现词 编辑:程序博客网 时间:2024/06/05 17:02

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

// [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传进断言里即可。