1、初试牛刀:筛选绿苹果

第一个解决方案可能是下面这样的:

public static List filterGreenApples(List inventory){

List result=new ArrayList<>();

//仅仅筛选出绿苹果

for (Apple apple : inventory) {

if ("green".equals(apple.getColor())){

result.add(apple);

}

}

return result;

}上面代码只针对绿苹果进行筛选,现在,我还想筛选出红苹果,该怎么做呢?简单的解决办法就是重复写一个方法,再改条件为红苹果,但是,要筛选的颜色有多种的情况,这样写会导致代码十分冗余,所以我们第一步尝试将其抽象化。

2、再展身手:把颜色作为参数

public static List filterGreenApples(List inventory,String color){

List result=new ArrayList<>();

//颜色作为参数

for (Apple apple : inventory) {

if (color.equals(apple.getColor())){

result.add(apple);

}

}

return result;

}但是现在又想根据苹果的重量对苹果进行筛选,那是不是也要用另外一个参数表示苹果重量呢?之后我又想加个标志区分对颜色和重量的查询呢?下面是展示一般写法,但是很傻。

3、第三次尝试:对你能想到的每个属性做筛选

public static List filterGreenApples(List inventory,String color,int weight,boolean flag){

List result=new ArrayList<>();

for (Apple apple : inventory) {

if (flag && color.equals(apple.getColor())|| (!flag && apple.getWeight()>weight)){

result.add(apple);

}

}

return result;

}

4、柳暗花明:行为参数化我们可以把行为进行参数化,来达到更高层次的抽象,首先定义一个统一的标准接口,再通过不同子类对其进行实现,这有点类似于策略设计模式的赶脚。

//封装了对选择苹果的策略

public interface ApplePredicate {

//具体算法交给子类去实现

boolean test (Apple apple);

}

//颜色算法

public class AppleGreenColorPredicate implements ApplePredicate {

@Override

public boolean test(Apple apple) {

return "green".equals(apple.getColor());

}

}

//重量算法

public class AppleHeavyWeightPredicate implements ApplePredicate {

@Override

public boolean test(Apple apple) {

return apple.getWeight()>150;

}

}

5、第四次尝试:根据抽象条件筛选

public static List filterApples(List inventory,ApplePredicate p){

List result = new ArrayList<>();

//行为参数化

for (Apple apple : inventory) {

if (p.test(apple)){

result.add(apple);

}

}

return result;

}我们在使用的时候可以传递不同的策略实现来达到目的

List heavyApples = filterApples(inventory, new AppleHeavyWeightPredicate());

List greenApples = filterApples(inventory, new AppleGreenColorPredicate());但是这样有个问题,就是每个策略我都要定义一个实现类去实现某个算法,导致后面如果有很多策略,会增加很多的类,我们知道使用匿名类也是一种不错的选择

6、第五次尝试:使用匿名类

List redApples = filterApples(inventory, new ApplePredicate() {

@Override

public boolean test(Apple apple){

return "red".equals(apple.getColor());

}

});但是问题又来了,匿名类还是不够好,第一,它往往很笨重,占用了很多的空间,第二,使用起来让人费解,导致代码可读性不高,即使匿名类处理在某种程度上改善了为一个接口声明好几个实体类的啰嗦问题,但是还是不能令人满意,自java8引入的lambda表达式——一种更简洁的传递代码的方式解决了这个问题。下面我们利用lambda表达式来改写前面的代码吧

7、第六次尝试:使用Lambda表达式

Listresult= filterApples(inventory, (Apple apple)-> "red".equals(apple.getColor()));不得不承认,使用lambda表达式改写之前的代码确实干净很多,因为它看起来更像问题陈诉本身了,解决了啰嗦的问题

8、第七次尝试:将List类型抽象化在通往抽象的路上,我们还可以进一步。目前filterApples方法还只适用Apple,我们还可以尝试适用在其他水果上。

public interface Predicate {

boolean test(T t);

}

//映入类型参数T

public static List filter(List list,Predicate p){

List result =new ArrayList<>();

for (T e : list) {

if (p.test(e)){

result.add(e);

}

}

return result;

}现在你可以吧filter方法作用在橘子,香蕉等列表上了。

9、小结行为参数化,就是一个方法接收不同的行为作为参数,并在内部使用他们,完成不同行为的能力。

行为参数化可以让代码更好的适应不断变化的要求,减轻未来的工作量。

传递代码,就是将新行为作为参数传递给方法,但是在java8之前实现起来很啰嗦。为接口声明许多只用一次的实体类而造成的啰嗦代码,在java8之前可以用匿名类来减少。

java API 包含很多可以用不同行为进行参数化的方法,包括排序、线程等。

java 参数传递实体类_Java8实战——通过行为参数化传递代码相关推荐

  1. 将JSON数据转换成JAVA的实体类

    思路:首先将JSON格式的数据转换成JSONObject,然后将JSONObject转换成Java的实体类(其中类属性包括List等类型) Java实体类: SearchFilter 类 1 publ ...

  2. 关于JAVA Bean实体类对象pojo,vo,po,dto,entity之间的区别

    关于JAVA Bean实体类对象pojo,vo,po,dto,entity之间的区别: Pojo: Pojo 普通的java对象 最基本的javaBean只有属性 加上属性的get,set方法,可以转 ...

  3. java响应实体类封装

    前后端分离的开发模式中,或者与第三方接口交互,需要规范接口响应,下面是我在开发中的封装的一组响应实体类 响应实体父类, 父类中需要一个code,因为不管是响应消息还是数据,都要有code /**- @ ...

  4. IDEA-自动生成java的实体类详细

    IDEA-自动生成java的实体类 1.项目添加数据库. 2.生成实体类 3. 修改默认生成脚本 idea这个功能真的不错,生成的实体类几乎不用改动. 下面生成展示(自动生成的,没有人工进行改动) 很 ...

  5. Java常用实体类--System类

    字符串.日期.数字是Java程序中最常使用的数据对象,对这些数据的创建.修改.格式化和转换等操作融入在Java程序的每个角落,必须熟练掌握.本节将通过实例演示以下常用实体类 Java系统级类:系统类S ...

  6. java获取实体类的属性和值

    package com.jackie.day11; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetE ...

  7. java中实体类中实现Serializable接口的作用

    在开发中 我们看到实体类实现 Serializable接口 还会写上下面一句话 private static final long serialVersionUID = 1L; 它的作用是实现序列化与 ...

  8. Java 判断实体类对象的全部属性是否空

    代码: public boolean checkObjAllFieldsIsNull(Object object) {// 如果对象为null直接返回trueif (null == object) { ...

  9. 【六】ElasticSearch8.x Java API 实体类、工具类、测试类及常见问题

    ES 8.x 新版本中,Type 概念被弃用,所以新版 JavaAPI 也相应做出了改变,使用更加简便.ES 官方从 7.15 起开始建议使用新的 JavaAPI 1.依赖 <!-- elast ...

最新文章

  1. 教你玩转 统一异常处理
  2. python求五个数中的最大值和最小值_python编程 求输入的10个数中的最大值和最小值,并输出它们各自是第几个...
  3. Oracle 11g 中告警日志的位置
  4. JSP第四篇【EL表达式介绍、获取各类数据、11个内置对象、执行运算、回显数据、自定义函数、fn方法库】...
  5. MySQL修改字符集
  6. 允许指定IP访问远程桌面
  7. 怎样将Excel中的数据导入到SQL Server 2000数据库中
  8. 透明计算:对当前主流计算模式的革命
  9. Google是如何赚钱的 -- 四年工作离别小结
  10. PS一键磨皮美白扩展插件Delicious Retouch 5.0 汉化集合版 Win/Mac
  11. JSK-布设光钎-Kruscal最小生成树-并查集-图的连通性
  12. 在麒麟桌面操作系统编译安装postgresql的经历
  13. 红孩儿编辑器的模块设计10
  14. C++从txt文本中输入和读取字符串
  15. 自动驾驶专题介绍 ———— 动力传动系统
  16. linux里的计划任务
  17. Ubuntu下视频播放加速软件SMPlyer
  18. 零基础入门NPL之新闻分类
  19. VMWare虚拟机下调整界面的大小
  20. I/O控制器及控制方式

热门文章

  1. 点击a标签怎么发起qq聊天
  2. CentOS 配置EPEL国内源
  3. 小米13屏幕尺寸 小米 13是双卡还是单卡?
  4. 终于!微信可以开“小号”了
  5. ajax提交Form表单数据到后台
  6. 华米CEO黄汪:创业是长期主义和专业主义的叠加
  7. LeetCode659:分割数组为连续子序列
  8. 读写锁(ReentranReadWriteLock))详解
  9. 如何查询电脑的是ip地址
  10. mdp框架_强化学习中q learning和MDP的区别是什么?