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 ...
随机推荐
- python 关于excel弹窗——请注意,您的文档的部分内容可能包含了文档检查器无法删除的个人信息解决方法
参考https://www.cnblogs.com/Jacklovely/p/6582732.html 这个问题的原因是由于工作簿包含宏.ActiveX控件等内容, 而Excel被设置为在保存文件时自 ...
- 从零开始搭建WebAPI Core_SqlSugar管理系统(一) 项目环境需求以及项目搭建
从零开始搭建WebAPI Core_SqlSugar管理系统(一) 项目环境需求以及项目搭建 环境需求 想要使用.NET Core,首先你的Visual Studio(以下简称vs)升级到较高的版本, ...
- 我又不是你的谁--java instanceof操作符用法揭秘
背景故事 <曾经最美>是朱铭捷演唱的一首歌曲,由陈佳明填词,叶良俊谱曲,是电视剧<水晶之恋>的主题曲.歌曲时长4分28秒. 歌曲歌词: 看不穿你的眼睛 藏有多少悲和喜 像冰雪细 ...
- 常用的js代码片段
1.单选框/手风琴 <script> $(document).ready(function(){ $("dd").on("click",functi ...
- ES6——箭头函数与普通函数的区别
ES6标准新增了一种新的函数:Arrow Function(箭头函数). 为什么叫Arrow Function?因为它的定义用的就是一个箭头: 语法: //1.没有形参的时候 let fun = () ...
- HashMap底层数据结构详解
一.HashMap底层数据结构 JDK1.7及之前:数组+链表 JDK1.8:数组+链表+红黑树 关于HashMap基本的大家都知道,但是为什么数组的长度必须是2的指数次幂,为什么HashMap的加载 ...
- for循环练习题1——水仙花数
/*输出所有的水仙花数,所谓水仙花数是指一个3位数,其各个位上数 字立方和等于其本身. 例如: 153 = 1*1*1 + 3*3*3 + 5*5*5 */class ForTest3{ public ...
- C、C++的Makefile模板
目录 Makefile模板 用法 编译C程序 编译C++程序 其他 Tips Makefile模板 CC = gcc LD = $(CC) TARGET = $(notdir $(CURDIR)) S ...
- cobalt strike笔记-CS与MSF,Armitage,Empire互转shell
0x01 Metasploit派生shell给Cobaltstrike 生成木马: msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata ...
- 基于常规DNS隧道进行的tcp端口转发dns2tcp的使用
0x01 安装Dns2TCP dns2tcp 是一个利用DNS隧道转发TCP连接的工具,使用C语言开发. sudo apt-get install dns2tcp 0x02配置dns2tcp 配置DN ...