前言:

以下内容来源于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. 学习VBA

    学习VBA VBA 就是 (Visual basic for Application) 用的比较多的是在Excel中处理数据,可以方便快捷地使用编程方式来对数据进行操作. VBA 数据类型 Integ ...

  2. echarts地图边界数据的实时获取与应用,省市区县多级联动【附最新geoJson文件下载】

    首先,来看下效果图 在线体验地址:https://hxkj.vip/demo/echartsMap/,并提供实时geoJson数据文件下载 echarts官方社区链接地址(可在线编辑):https:/ ...

  3. pycharm 激活码 2019/11最新福利(2)

    812LFWMRSH-eyJsaWNlbnNlSWQiOiI4MTJMRldNUlNIIiwibGljZW5zZWVOYW1lIjoi5q2j54mIIOaOiOadgyIsImFzc2lnbmVlT ...

  4. idea 新建项目 coding上新建项目 idea推送到coding

    1. 注册coding a. 首先在(https://coding.net)上创建项目 ps:跳过注册 ![file](https://img2018.cnblogs.com/blog/1416679 ...

  5. github项目上传管理

    一.完成项目后再在github上面新建仓库然后上传代码文件 1.创建仓库时不初始化README.md文件 touch README.md //此行可忽略 git init //初始化仓库 git ad ...

  6. 原生js使用getComputedStyle方法获取CSS内部属性值

    在对网页进行调试的过程中,经常会用到js来获取元素的CSS样式, 1.下面的方法只能JS只能获取写在html标签中的写在style属性中的值(style=”…”),而无法获取定义在<style ...

  7. 基于Spring AOP实现的权限控制

    1.AOP简介 AOP,面向切面编程,往往被定义为促使软件系统实现关注点的分离的技术.系统是由许多不同的组件所组成的,每一个组件负责一块特定的功能.除了实现自身核心功能之外,这些组件还经常承担着额外的 ...

  8. e课表项目第二次冲刺周期第八天

    昨天完成了什么? 昨天,我们组商量讨论了二层界面的设计,添加课程所需要的信息大概有:课程名称.教室.任课教师.上课时间.类型(单周.双周.单双周)以及备注等等.然后,我们通过界面的UI设计,让我们软件 ...

  9. POJ - 2393Yogurt factory

    The cows have purchased a yogurt factory that makes world-famous Yucky Yogurt. Over the next N (1 &l ...

  10. MySQL复制从库建立-mysqldump方式

    环境准备: master:192.168.0.106:3306slave:192.168.0.105:3306 主和从都必须配置有唯一的ID(server_id:建议ip最后一组+MySQL端口号,例 ...