JAVA8学习之行为参数化

简介: 我们要判断多个苹果里面的绿颜色和大于150g的苹果,或者说后面会加入更多的筛选条件,用if/else太显得臃肿,所以,java8提出了行为参数化,我们按照以下两步来进行行为参数化的说明,也是对自己的学习的一个总结。

我们要判断多个苹果里面的绿颜色和大于150g的苹果,或者说后面会加入更多的筛选条件,用if/else太显得臃肿,所以,java8提出了行为参数化,我们按照以下两步来进行行为参数化的说明,也是对自己的学习的一个总结。

处理这种问题首先要先建立一个公共的接口,这个接口里有一个方法,就是来接收所有的条件:

public interface FormatApple {
    boolean test(Apple apple);
}

然后分别建立两个实现,一个是颜色,一个是重量,可以把参数作为重写方法的主要内容。

public class ColorAppleOp implements FormatApple {
    @Override
    public boolean test(Apple apple) {
        return "green".equals(apple.getColor());
    }
}
public class WeightOp implements FormatApple {
    @Override
    public boolean test(Apple apple) {
        return Integer.parseInt(apple.getWight())>150;
    }
}

两个类里面都针对不同的条件进行判断,返回一个boolean类型的结果,我们在执行的时候就可以直接判断,那个实体对象符合条件,返回了true,然后将其放入list中返回。

  public class MainDo {
      public static List<Apple> appleList(List<Apple> apples, FormatApple formatApple){
          List<Apple> apples1 = new ArrayList<>();
          for (Apple apple:apples){
              if (formatApple.test(apple)){
                      apples1.add(apple);
              }
          }
          return apples1;
      }
      public static void main(String[] args) {
          Apple a = new Apple();
          a.setColor("green");
          a.setWight("200");
          Apple a2 = new Apple();
          a2.setWight("100");
          a2.setColor("green");
          Apple a3 = new Apple();
          a3.setColor("red");
          a3.setWight("250");
          List alist = new ArrayList();
          alist.add(a);
          alist.add(a2);
          alist.add(a3);
          //筛选出绿色的苹果
          List<Apple> resultA1 = appleList(alist,new ColorAppleOp());
          //筛选出重量大于>150g的苹果
          List<Apple> resultA2 = appleList(alist,new WeightOp());
          for (Apple apple: resultA1){
              System.out.println(apple.getColor()+apple.getWight());
          }
          System.out.println("--------------------");
          for (Apple apple1: resultA2){
              System.out.println(apple1.getColor()+apple1.getWight());
          }
      }
  }

输出结果:

green200
green100
--------------------
green200
red250

这样我们就初步实现了行为参数化,但是这样写就会多建立很多的实现类,也是很臃肿,那么如何实现呢,接下来我们可以再优化一下下。

接口这里我们用泛型来接收传过来的不同实体参数:

public interface FormatApple<T> {
    boolean test(T t);
}

然后再主要执行类中MainDo里全部修改成泛型类型:

public static <T> List<T> appleList(List<T> apples, FormatApple<T> formatApple){
        List<T> apples1 = new ArrayList<T>();
        for (T apple:apples){
            if (formatApple.test(apple)){
                    apples1.add(apple);
            }
        }
        return apples1;
    }

在筛选的代码位置,我们替换成以下代码:

这是利用Lambda表达式,真正的实现行为参数化

 List<Apple> resultA1 = appleList(alist,(Apple apple) -> "green".equals(apple.getColor()));
 List<Apple> resultA2 = appleList(alist,(Apple apple) -> Integer.parseInt(apple.getWight())>150);

当我们需要改变时,只需要传不同的实体类型就可以,不需要我们再建立多个实现类,直接一个接口,在实现类里写对应的结构方法,将接口实体作为参数传递进来,并通过泛型,扩大对不同实体的处理,将行为参数条件化:

List<Banana> resultA3 = appleList(alist,(Banana banana) -> Integer.parseInt(banana.getWeight())>150);

具体代码:

public class MainDo {
    public static <T> List<T> appleList(List<T> apples, FormatApple<T> formatApple){
        List<T> apples1 = new ArrayList<T>();
        for (T apple:apples){
            if (formatApple.test(apple)){
                    apples1.add(apple);
            }
        }
        return apples1;
    }
    public static void main(String[] args) {
        Banana a = new Banana();
        a.setColor("green");
        a.setWeight("200");
        Banana a2 = new Banana();
        a2.setWeight("100");
        a2.setColor("green");
        Apple a3 = new Apple();
        a3.setColor("red");
        a3.setWight("250");
        List alist = new ArrayList();
        alist.add(a);
        alist.add(a2);
        //筛选出绿色的苹果
        /*List<Apple> resultA1 = appleList(alist,new ColorAppleOp());
        //筛选出重量大于>150g的苹果
        List<Apple> resultA2 = appleList(alist,new WeightOp());*/
      /*  List<Apple> resultA1 = appleList(alist,(Apple apple) -> "green".equals(apple.getColor()));
        List<Apple> resultA2 = appleList(alist,(Apple apple) -> Integer.parseInt(apple.getWight())>150);*/
        List<Banana> resultA3 = appleList(alist,(Banana banana) -> Integer.parseInt(banana.getWeight())>150);
        for (Banana banana: resultA3){
            System.out.println(banana.getClass().toString()+""+banana.getColor()+banana.getWeight());
        }
      /*  System.out.println("--------------------");
        for (Apple apple1: resultA2){
            System.out.println(apple1.getColor()+apple1.getWight());
        }*/
    }
}


相关文章
|
3月前
|
XML Java 编译器
Java学习十六—掌握注解:让编程更简单
Java 注解(Annotation)是一种特殊的语法结构,可以在代码中嵌入元数据。它们不直接影响代码的运行,但可以通过工具和框架提供额外的信息,帮助在编译、部署或运行时进行处理。
109 43
Java学习十六—掌握注解:让编程更简单
|
3月前
|
存储 SQL 小程序
JVM知识体系学习五:Java Runtime Data Area and JVM Instruction (java运行时数据区域和java指令(大约200多条,这里就将一些简单的指令和学习))
这篇文章详细介绍了Java虚拟机(JVM)的运行时数据区域和JVM指令集,包括程序计数器、虚拟机栈、本地方法栈、直接内存、方法区和堆,以及栈帧的组成部分和执行流程。
49 2
JVM知识体系学习五:Java Runtime Data Area and JVM Instruction (java运行时数据区域和java指令(大约200多条,这里就将一些简单的指令和学习))
|
2月前
|
Java 大数据 API
14天Java基础学习——第1天:Java入门和环境搭建
本文介绍了Java的基础知识,包括Java的简介、历史和应用领域。详细讲解了如何安装JDK并配置环境变量,以及如何使用IntelliJ IDEA创建和运行Java项目。通过示例代码“HelloWorld.java”,展示了从编写到运行的全过程。适合初学者快速入门Java编程。
|
2月前
|
JavaScript Java 项目管理
Java毕设学习 基于SpringBoot + Vue 的医院管理系统 持续给大家寻找Java毕设学习项目(附源码)
基于SpringBoot + Vue的医院管理系统,涵盖医院、患者、挂号、药物、检查、病床、排班管理和数据分析等功能。开发工具为IDEA和HBuilder X,环境需配置jdk8、Node.js14、MySQL8。文末提供源码下载链接。
|
3月前
|
小程序 Oracle Java
JVM知识体系学习一:JVM了解基础、java编译后class文件的类结构详解,class分析工具 javap 和 jclasslib 的使用
这篇文章是关于JVM基础知识的介绍,包括JVM的跨平台和跨语言特性、Class文件格式的详细解析,以及如何使用javap和jclasslib工具来分析Class文件。
63 0
JVM知识体系学习一:JVM了解基础、java编译后class文件的类结构详解,class分析工具 javap 和 jclasslib 的使用
|
3月前
|
前端开发 Java 应用服务中间件
Javaweb学习
【10月更文挑战第1天】Javaweb学习
41 2
|
3月前
|
存储 缓存 Java
【用Java学习数据结构系列】HashMap与TreeMap的区别,以及Map与Set的关系
【用Java学习数据结构系列】HashMap与TreeMap的区别,以及Map与Set的关系
47 1
|
3月前
|
存储 搜索推荐 算法
【用Java学习数据结构系列】七大排序要悄咪咪的学(直接插入,希尔,归并,选择,堆排,冒泡,快排)以及计数排序(非比较排序)
【用Java学习数据结构系列】七大排序要悄咪咪的学(直接插入,希尔,归并,选择,堆排,冒泡,快排)以及计数排序(非比较排序)
35 1
|
3月前
|
存储 算法 Java
带你学习java的数组军队列
带你学习java的数组军队列
43 0
|
3月前
|
Java 大数据 开发工具
java学习——环境准备(1)
java学习——环境准备(1)
45 0
下一篇
开通oss服务