前言:

以下内容来源于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 - 行为参数化的更多相关文章

  1. Java通过行为参数化传递代码

    在软件工程中,一个众所周知的问题就是,不管做什么,用户的需求肯定会变.如何应对这样不断变化的需求?理想的状态下,应该把的工作量降到最少.此外,类似的新功能实现起来还应该很简单,而且易于长期维护.行为参 ...

  2. java 字符串中参数化符号${}的解析

    我们在很多地方都能看到代表参数意义的符号${},可能我们在写一些框架的时候,有时候也需要用到这个符号,但他们是如何精确解析的?或者说需要我们自已写的时候,如何写?我们先来看以下的几个场景: 1.字符串 ...

  3. Java+Selenium 如何参数化验证Table表格数据

    场景: 当我们编写脚本时候,需要验证某个表格某一列数据,或者多个列数据. 如果每验证一个就写一个方法,实在是太费事, 因此我们需要有参数化的思想,把某列数据看成固定的元素,然后去验证即可. 1. 示例 ...

  4. Thinking in Java 学习笔记(一)

    chapter_01 对象导论 1.1  Java语言基础Smalltalk的特性: 万物皆对象  可以将对象视为一种奇特的变量,它可以存储数据(成员变量),也可以在自身上执行操作(方法). 程序对象 ...

  5. Wmyskxz文章目录导航附Java精品学习资料

    前言:这段时间一直在准备校招的东西,所以一晃眼都好长时间没更新了,这段时间准备的稍微好那么一点点,还是觉得准备归准备,该有的学习节奏还是要有..趁着复习的空隙来整理整理自己写过的文章吧..好多加了微信 ...

  6. 【译】9. Java反射——泛型

    原文地址:http://tutorials.jenkov.com/java-reflection/generics.html ===================================== ...

  7. Jmeter JAVA请求入门

    一.Jmeter完成一个java请求实现方法 两种实现方式: 实现JavaSamplerClient接口 继承AbstractJavaSamplerClient抽象类 二.使用AbstractJava ...

  8. (私人收藏)[开发必备]最全Java离线快速查找手册(可查询可学习,带实例)

    (私人收藏)[开发必备]最全Java离线快速查找手册(可查询可学习,带实例) https://pan.baidu.com/s/1L54VuFwCdKVnQGVc8vD1TQnwmj java手册 Ja ...

  9. Jenkins之前置替换脚本内容

    在执行Jenkins任务前,需要修改执行的工程的某个文件中的内容,在前置步骤中编写脚本进行修改. Pre Steps Windows batch script @echo off CHCP setlo ...

随机推荐

  1. <机器学习>无监督学习算法总结

    本文仅对常见的无监督学习算法进行了简单讲述,其他的如自动编码器,受限玻尔兹曼机用于无监督学习,神经网络用于无监督学习等未包括.同时虽然整体上分为了聚类和降维两大类,但实际上这两类并非完全正交,很多地方 ...

  2. windows下 python 如何安装pygame模块

    本机系统:win7,Pyhon版本: 3.6.0 1. 安装下载python官网 https://www.python.org/ 下载地址 https://www.python.org/downloa ...

  3. 《构建之法》项目管理&典型用户和场景

    项目管理   PM的能力要求和任务: 1.观察.理解和快速学习能力 2.分析管理能力 3.一定的专业能力 4.自省的能力 在一个项目中,PM的具体任务: 1.带领团队形成团队的目标/远景,把抽象的目标 ...

  4. java中String转Date与Date转String

    public static void main(String[] args) throws ParseException { SimpleDateFormat simpleDateFormat = n ...

  5. SpringBootSecurity学习(23)前后端分离版之OAuth2.0 其它模式

    密码模式 前面介绍了授权码模式和刷新令牌两种获取最新令牌的方法,下面来看一下其它模式.首先看密码模式,我们默认配置的三种模式中其实就包含密码模式的支持: 因此我们启动项目,直接使用密码模式即可,访问地 ...

  6. Formform

    知识预览 一 Django的form组件 二 Django的model form组件 三 Django的缓存机制 四 Django的信号 五 Django的序列化 回到顶部 一 Django的form ...

  7. JZOJ 3875 星球联盟

    [问题描述] 在遥远的 S 星系中一共有 N 个星球,编号为 1…N.其中的一些星球决定组成联盟, 以方便相互间的交流. 但是,组成联盟的首要条件就是交通条件.初始时,在这 N 个星球间有 M 条太空 ...

  8. SQL Server 2012企业版和标准版的区别

    关于使用Microsoft SQL Server 数据库的公司一般会有疑问,企业版数据库和标准版数据库的区别在哪?如果采购企业版的价格和标准版的价格相差很大,从多方资料查询发现,我认为最主要的区别是硬 ...

  9. Neo4j:图数据库GraphDB(二)高级查找

    接着上一篇,继续介绍图数据库Neo4j: http://www.cnblogs.com/rongyux/p/5537028.html 三 高级查找操作 1过滤   name = "Tom H ...

  10. 机器学习:数据清洗及工具OpenRefine

    数据分析中,首先要进行数据清洗,才可以继续训练模型,预测等操作. 首先介绍一下什么是数据清洗(定义来自 百度百科,有删减) 数据清洗从名字上也看的出就是把“脏”的“洗掉”,指发现并纠正数据文件中可识别 ...