java8学习笔记1--通过行为参数传递代码

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,想要学习更多请购买正版书籍
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值