Java8新特性之:行为参数化传递代码

    行为参数化:一个方法接受多个不同的行为(或战略)作为参数,并在内部使用他们,完成不同的行为的能力。 

public interface ApplePredicate {
    /**
    * 谓词(选择标准)
    * @param apple
    * @return
    */
    boolean test(Apple apple);
}
public class AppleWeightPredicate implements ApplePredicate{
    @Override
    public boolean test(Apple apple) {
        return apple.getWeight() > 150;
    }
}
public class AppleGreenColorPredicate implements ApplePredicate{
    @Override
    public boolean test(Apple apple) {
        return "green".equals(apple.getColor());
    }
}
public class FilterApples {
    /**
    * ApplePredicate参数实现了行为参数化
    * @param inventory
    * @param p
    * @return
    */
    public static List<Apple> filterApples(List<Apple> inventory, ApplePredicate p) {
        List<Apple> result = new ArrayList<Apple>();
        for (Apple apple : inventory) {
            if (p.test(apple)) {
                result.add(apple);
            }
        }
        return result;
    }
    
    /**
    * 匿名类实现
    * @param inventory
    * @return
    */
    public List<Apple> redApples(List<Apple> inventory) {
        return filterApples(inventory, new ApplePredicate() {
            @Override
            public boolean test(Apple apple) {
                return "red".equals(apple.getColor());
            }
        });
    }
    /**
    * 使用Lambda表达式
    * @param inventory
    * @return
    */
    public List<Apple> yellowApples(List<Apple> inventory) {
        return filterApples(inventory, (Apple apple) -> "yellow".equals(apple.getColor()));
    }
}

 

    List类型抽象化:

public interface CommonPredicate<T> {
    /**
    * 类型抽象化
    * @param t
    * @return
    */
    boolean test(T t);
}
public class filter {
  /**
  * list类型抽象化
  * @param list
  * @param p
  * @param <T>
  * @return
  */
  public static <T> List<T> filter(List<T> list, CommonPredicate<T> p) {
        List<T> result = new ArrayList<T>();
    for (T e : list) {
      if (p.test(e)) {
        result.add(e);
      }
    }
    return result;
  }
    
  public List<Apple> redApples(List<Apple> inventory) {
    return filter(inventory, (Apple apple) -> "red".equals(apple.getColor()));
  }
    
  public List<Integer> main(List<Integer> inventory) {
      return filter(inventory, (Integer i) -> i % 2 == 0);
    }
}

    行为参数化类似于策略设计模式。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值