Java 8 - 行为参数化
前言:
以下内容来源于java8实战一书,我将里面学习的内容做一个整理,方便忙碌的小伙伴快速入门实战java8
正文:
假设一个果农收获了一园的苹果,他需要你根据他的条件筛选出满意的苹果
首先我们新建一个Apple类
public class Apple {
/**
* 重量
*/
private Integer weight;
/**
* 颜色
*/
private String color;
getter();
setter();
toString();
...
}
他说:我需要挑出红苹果
public void filterRedApple(List<Apple> appleList){
for(Apple apple : appleList){
if("red".equals(apple)){
System.out.println("红苹果");
}
}
}
他说:我要挑出绿苹果
转念一想,把颜色作为参数吧
public void filterGreenApple(List<Apple> appleList , String color) {
for (Apple apple : appleList) {
if (color.equals(apple)) {
System.out.println("绿苹果");
}
}
}
他说:我需要挑出150g的苹果
public void filterWeightApple(List<Apple> appleList,Integer weight) {
for (Apple apple : appleList) {
if (apple.getWeight() > weight) {
System.out.println("重量大于150g的苹果");
}
}
}
他说:我要挑出100g以上的红苹果
public void filterAppleByWeightAndColor(List<Apple> appleList,String color,Integer weight){
for (Apple apple : appleList) {
if (apple.getWeight() > weight && color.equals(apple.getColor())) {
System.out.println("重量大于100g的红苹果");
}
}
}
面对无止境的需求变化,我们需要不断的适应
让我们来看看如何改进
新建一个苹果筛选接口
public interface ApplePredicate {
/**
* 筛选苹果
*/
boolean test(Apple apple);
}
然后我们分别实现筛选方法
根据颜色筛选
public class FilterRedApple implements ApplePredicate {
@Override
public boolean test(Apple apple) {
return "red".equals(apple.getColor()) ? true : false;
}
}
根据重量筛选
public class FilterWeightApple implements ApplePredicate {
@Override
public boolean test(Apple apple) {
return apple.getColor() > 100 ? true : false;
}
}
根据颜色和重量筛选
public class FilterAppleByColorAndWeight implements ApplePredicate {
@Override
public boolean test(Apple apple) {
return "red".equals(apple.getColor()) && apple.getWeight > 100 ? true : false;
}
}
比如他想要红苹果
我们这样来给他实现
public static void filterApple(List<Apple> appleList , ApplePredicate p) {
for (Apple apple : appleList) {
if (p.test(apple)) {
System.out.println("这是你要的苹果" + apple.toString());
}
}
}
我们调用的时候,传入它的实现类就行了
public static void main(String[] args) {
filterApple(appleList, new FilterRedApple());
filterApple(appleList, new FilterWeightApple());
}
我们来看看现在的方法和原先的方法的区别:
原先的方法是每提出一个需求我们就新写一个方法来实现它,这样代码会显得非常臃肿冗余,因为他们其实是做的同一件事:筛选想要的苹果,仅仅只是条件不同
我们改进后的方法是:写一个筛选接口,然后分别实现这个接口,比如你想要红苹果就写个晒选红苹果的实现,想要大的苹果就再写一个新的实现
这看起来有点像策略模式
好的。我们已经完成了一件非常酷的事:fliterApple方法的行为取决于我们通过ApplePredicate对象传递的代码,这个就是行为参数化,它可以帮助我们编写灵活的API
现在,可能有同学会问我,每次新的需求都写一个新的实现类,会不会太麻烦了,我们可以用匿名类来实现啊
确实,我们可以用匿名类来实现
public static void main(String[] args) {
filterApple(appleList, new ApplePredicate() {
@Override
public boolean test(Apple apple) {
return "red".equal(apple.getColor) ? true : false;
}
});
}
虽然匿名类在一定程度上改善了为一个接口写好几个实现类的啰嗦问题,但它还是要创建一个对象明确的实现新的方法来定义一个新的行为
所以,相较之下我更倾向于使用行为参数化的形式
概念:
行为参数化:一个方法接受多个不同的行为作为参数,并在内部使用他们,完成不同行为的能力
行为参数化可以让代码更好的适应不断变化的需求,减轻未来的工作量
传递代码:将新行为作为参数传递给方法
Java 8 - 行为参数化的更多相关文章
- Java通过行为参数化传递代码
在软件工程中,一个众所周知的问题就是,不管做什么,用户的需求肯定会变.如何应对这样不断变化的需求?理想的状态下,应该把的工作量降到最少.此外,类似的新功能实现起来还应该很简单,而且易于长期维护.行为参 ...
- java 字符串中参数化符号${}的解析
我们在很多地方都能看到代表参数意义的符号${},可能我们在写一些框架的时候,有时候也需要用到这个符号,但他们是如何精确解析的?或者说需要我们自已写的时候,如何写?我们先来看以下的几个场景: 1.字符串 ...
- Java+Selenium 如何参数化验证Table表格数据
场景: 当我们编写脚本时候,需要验证某个表格某一列数据,或者多个列数据. 如果每验证一个就写一个方法,实在是太费事, 因此我们需要有参数化的思想,把某列数据看成固定的元素,然后去验证即可. 1. 示例 ...
- Thinking in Java 学习笔记(一)
chapter_01 对象导论 1.1 Java语言基础Smalltalk的特性: 万物皆对象 可以将对象视为一种奇特的变量,它可以存储数据(成员变量),也可以在自身上执行操作(方法). 程序对象 ...
- Wmyskxz文章目录导航附Java精品学习资料
前言:这段时间一直在准备校招的东西,所以一晃眼都好长时间没更新了,这段时间准备的稍微好那么一点点,还是觉得准备归准备,该有的学习节奏还是要有..趁着复习的空隙来整理整理自己写过的文章吧..好多加了微信 ...
- 【译】9. Java反射——泛型
原文地址:http://tutorials.jenkov.com/java-reflection/generics.html ===================================== ...
- Jmeter JAVA请求入门
一.Jmeter完成一个java请求实现方法 两种实现方式: 实现JavaSamplerClient接口 继承AbstractJavaSamplerClient抽象类 二.使用AbstractJava ...
- (私人收藏)[开发必备]最全Java离线快速查找手册(可查询可学习,带实例)
(私人收藏)[开发必备]最全Java离线快速查找手册(可查询可学习,带实例) https://pan.baidu.com/s/1L54VuFwCdKVnQGVc8vD1TQnwmj java手册 Ja ...
- Jenkins之前置替换脚本内容
在执行Jenkins任务前,需要修改执行的工程的某个文件中的内容,在前置步骤中编写脚本进行修改. Pre Steps Windows batch script @echo off CHCP setlo ...
随机推荐
- jQuery常用方法(五)-jQuery CSS
JQuery CSS 方法说明 css( name ) 访问第一个匹配元素的样式属性. css( properties ) 把一个"名/值对"对象设置为所有匹配元素的样式属性. $ ...
- php echo/print 输出函数比较
一.两者区别 echo 支持多个字符串输出,用逗号(,)隔开,print只支持一个字符串输出 echo 输出速度比print快 echo 没有返回值,print返回值总是1 二.使用 echo e ...
- 挑战程序设计——迷宫的最短路径(BFS)
题目详情 Description 给定一个大小为 N * M 的迷宫.迷宫由通道和墙壁组成,每一步可以向邻接的上下左右四格的通道移动.请求出从起点到终点所需的最小步数 限制条件: N,M <= ...
- JS时间格式CST转GMT
转换方法:JS 时间格式CST转GMT 时区和Date:Java中的Date和时区转换
- xamarin开发的mac开发小工具集合
兄弟们我拖控件拖到了mac系统去了, 工具上传到百度网盘,下载地址 链接:https://pan.baidu.com/s/1Q64zoRjE3u66jJnzF8rhww提取码:ljx2 这款工具我是用 ...
- 引入外部js
引入外部js应该使用完整标签<script></script>,而使用单标签<script src=“”/>是错误的
- k8s中负载均衡器【ingress-nginx】部署
在Kubernetes中,服务和Pod的IP地址仅可以在集群网络内部使用,对于集群外的应用是不可见的.为了使外部的应用能够访问集群内的服务,在Kubernetes 目前 提供了以下几种方案: Node ...
- RMAN详细教程(二):备份、检查、维护、恢复
RMAN详细教程(一):基本命令代码 一.创建增量备份 增量备份级别为0-4,但为方便备份管理,oracle建议只限于0级和1级. 1.差异增量备份(differential incremental ...
- C-02 推荐系统
目录 推荐系统 一.导入模块 二.收集数据 三.数据预处理 3.1 无评分电影处理 四.协同过滤算法-基于用户的推荐 4.1 余弦相似度 4.2 数据标准化处理 五.预测 六.测试 更新.更全的< ...
- GUI tkinter (Entry) 输入框篇
"""1.其他函数不常用,这里只说get函数,get函数使用的时候不需要任何参数,它的返回值就是该输入框的内容.""" from tkint ...