Java8学习笔记之行为参数化
来源:互联网 发布:非农历史数据统计 编辑:程序博客网 时间:2024/06/03 05:54
摘要: 原创出处 http://peijie2016.oschina.io 欢迎转载,保留摘要,谢谢!
用一个例子说明行为参数化
带来的变化 - 从苹果仓库中筛选苹果
版本1
从一个苹果集合中选出绿的苹果
public static List<Apple> filterGreenApples(List<Apple> inventory) { List<Apple> result = new ArrayList<Apple>(); for (Apple apple : inventory) { if ("green".equals(apple.getColor()) { result.add(apple); } } return result; }
版本2
这时,如果需求变了,要从集合中选出红苹果,我们会这样
public static List<Apple> filterApplesByColor(List<Apple> inventory, String color) { List<Apple> result = new ArrayList<Apple>(); for (Apple apple : inventory) { if (apple.getColor().equals(color)) { result.add(apple); } } return result; }
然后传入颜色参数来筛选
List<Apple> apples = filterApplesByColor(inventory, "red");
版本3
但是,如果现在要选出重量超过150g的苹果呢?在方法参数列表中多加一个weight么?
你会发现我们所有的代码,只有if判断中的条件发生了变化,这违反了DRY原则(Don’t Repeat Yourself)。
所以,我们把整个具体行为作为参数来传递,这样,方法体本身的代码就可以复用了。
// 定义一个接口 public interface ApplePredicate { boolean test(Apple apple); } 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()); } }
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; }
现在,我们可以很灵活的调用了
List<Apple> redAndHeavyApples = filterApples(inventory, new AppleHeavyWeightPredicate());
版本4
其实,接口的具体实现,我们只会用到一次。所以,我们可以改成匿名类:
List<Apple> redApples = filterApples(inventory, new ApplePredicate() { public boolean test(Apple apple) { return "red".equals(apple.getColor()); } });
现在,代码已经变得非常简洁和灵活了。
版本5
从Java8开始,我们可以利用Lambda表达式,进一步改进代码:
List<Apple> result = filterApples(inventory, (Apple apple) -> "red".equals(apple.getColor()));
现在,调用方法,我们只要一行代码,而且代码的可读性非常好。
1 0
- Java8学习笔记之行为参数化
- java8之行为参数化(一)
- java8之行为参数化(二)
- Java8-行为参数化
- 【Java8】 行为化参数
- java8之行为参数化(函数为值化)
- JAVA8实战 第二章行为参数化
- 从JAVA行为参数化到 JAVA8 lamada,方法引用
- java8新特性(一):行为参数化
- Java8函数式编程之一: 行为参数化
- java8实战一:通过行为参数化传递代码
- Java8学习笔记之Lambda表达式
- Java8学习笔记之Stream API
- Java8学习笔记之新日期API
- Java8 in action(1) 通过行为参数化传递代码--lambda代替策略模式
- JAVA8 in Action:行为参数化,匿名类及lambda表达式的初步认知实例整理
- JADE学习笔记之三:行为
- java8 Stream学习笔记
- Android framework add service
- ABCD类网络地址
- MySQL 5.6 (Win7 64位)下载、安装与配置图文教程
- 基于HTTP协议实现的小型web服务器
- 在OkHttp的使用过程中出现下列问题Picasso detected an unsupported OkHttp on the classpath.
- Java8学习笔记之行为参数化
- Memcached简单介绍
- 100道动态规划——36 UVA 1220 Party at Hali-Bula 树形DP 最大独立集 思考欠妥
- (one day one problem)poj 2800 Joseph's Problem (数学)
- python递归,汉诺塔
- js性能优化
- 深度剖析空间配置器(三)内存处理函数
- 获取镜像
- 查找某个类中是否有某个注解