Lamda拉姆达表达式演化过程

作者: 叫练

简介

HI!小伙伴们,好久没见了,4月份开始断更,中途有点事儿,今天开始更新了,整理一篇Lamda表达式演化过程,希望喜欢的一如既往的支持!

image.png

传统集合过滤

现在有2个需求:在一组学生集合中,1.找出年龄大于20学生 2.找出分数小于70的学生 ;下面让们看看代码吧!

/**
 * @author :jiaolian
 * @date :Created in 2021-07-12 15:14
 * @description:学生测试
 * @modified By:
 * 公众号:叫练
 */
public class Student {
    //姓名
    private String name;
    //年龄
    private int age;
    //分数
    private double score;
    public Student(String name, int age, double score) {
        this.name = name;
        this.age = age;
        this.score = score;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public double getScore() {
        return score;
    }
    public void setScore(double score) {
        this.score = score;
    }
    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", score=" + score +
                '}';
    }
}
List<Student> students = Arrays.asList(
            new Student("张三",21,58),
            new Student("李四",23,88),
            new Student("王五",19,68),
            new Student("叫练",25,78),
            new Student("jiaolian",16,98)
    );
    //需求:1.找出年龄大于20学生;2.找出分数小于70的学生
    @Test
    public void test1() {
        List<Student> stus =  findStudentByAge();

        System.out.println(stus);
        System.out.println("===========");
        List<Student> stus1 =  findStudentByScore();
        System.out.println(stus1);
    }
    //通过年龄过滤学生
    public List<Student> findStudentByAge() {
        List<Student> stus = new ArrayList<>();
        for (int i=0; i<students.size(); i++) {
            if (students.get(i).getAge() > 20) {
                //将年龄大于20学生放入stus里
                stus.add(students.get(i));
            }
        }
        return stus;
    }
    //通过分数过滤学生
    public List<Student> findStudentByScore() {
        List<Student> stus = new ArrayList<>();
        for (int i=0; i<students.size(); i++) {
            if (students.get(i).getScore() < 70) {
                //将找出分数小于70的学生放入stus里
                stus.add(students.get(i));
            }
        }
        return stus;
    }

如上代码:代码逻辑比较简单,findStudentByAge() 方法是通过年龄过滤学生,在students学生集合中通过循环过滤出大于年龄20的学生放入新的集合stus中,最终返回stus对象,同理,通过分数过滤学生也是这样,在测试方法test1中,调用findStudentByAge()和findStudentByScore();最终打印输出结果如下:

image.png

代码的结果们输出了,结果输出没有问题,但是看上去有些臃肿,因为除了过滤条件外,for循环等其他的好像都是重复的,如果们需要再增加一个通过姓名过滤学生,又得写一个方法。针对已有代码,下面们看看策略模式如何解决!

演化1:接口策略模式

们新增一个处理学生集合的接口

/**
 * 学生处理接口
 */
public interface StudentHandler<T> {
    //处理学生
    boolean handlerStu(T t);
}
/**
 * @author :jiaolian
 * @date :Created in 2021-07-12 15:42
 * @description:处理学生年龄大于20
 * @modified By:
 * 公众号:叫练
 */
public class HandlerAge implements StudentHandler<Student> {
    @Override
    public boolean handlerStu(Student student) {
        return student.getAge()>20;
    }
}
@Test
    public void test2() {
        List<Student> res = getStudents(students,new HandlerAge());
        System.out.println(res);
    }
    /**
     * 通过条件过滤学生
     * @param stus
     * @param studentHandler
     * @return
     */
    public List<Student> getStudents(List<Student> stus,StudentHandler<Student> studentHandler) {
        List<Student> res = new ArrayList<>();
        for (int i=0; i<stus.size(); i++) {
            //接口条件
            if (studentHandler.handlerStu(stus.get(i))) {
                res.add(stus.get(i));
            }
        }
        return res;
    }

如上代码:新建StudentHandler接口处理学生,HandlerAge实现类实现了StudentHandler,用于过滤学生年龄大于20的对象,getStudents方法接收stus和studentHandler对象分别表示原始学生对象和接口实现new HandlerAge(),调用该方法最终打印学生年龄大于20的对象,和上面结果一致。如果现在们需要通过分数处理,们新增一个HandlerScore类实现StudentHandler接口就可以了,大家可以自行测试下,但是有个缺点,类变多了 。下面们看看匿名内部类如何实现过滤分数小于70的学生。

演化2:匿名内部类

@Test
    public void test3() {
        //匿名内部类实现
        List<Student> res = getStudents(students, new StudentHandler<Student>() {
            @Override
            public boolean handlerStu(Student student) {
                return student.getScore() <70;
            }
        });
        System.out.println(res);
    }

如上代码:该匿名对象实现了过滤分数小于70的学生。

演化3:lamda表达式

上面的代码已经足够简单,但自从JDK1.8开始支持了Lambda,们针对上面的代码再做一次优化。

@Test
    public void test4() {
        List<Student> res = getStudents(students, student -> student.getScore() <70);
        System.out.println(res);
    }

如上代码:student -> student.getScore() <70注意改代码格式就是Lamda格式,左边表示参数,如果有多个参数需要用括号表示,右边是实现过程,看!写法上非常简单,注意:lamda需要函数接口支持:那什么是函数接口呢,只有一个抽象方法的接口称为函数接口。他的好处是简化表达,代码更通俗易懂,同时需要jdk1.8以上版本支持哦!

总结


好啦,今天们就讲到这里,希望大家有疑问可以提问,欢迎和交流。是【公众号:叫练,边叫边练 喜欢的可以加关注哦!再次感谢大家的观看支持。

[] ) [](top

原文创作:叫练

原文链接:https://www.cnblogs.com/jiaolian/p/15020834.html

文章列表

更多推荐

更多
  • Ansible2安全自动化-十、编写安全测试的 Ansible 模块 开始使用 hello world Ansible 模块,密码,建立开发环境,计划和要记住的内容,OWASP ZAP 模块,使用 Docker 创建 ZAP,创建易受攻击的应用,Ansible 模块模板,[计]元数据,记录模块,源代码模板
    Apache CN

  • Ansible2安全自动化-十一、可靠的安全最佳实践、参考和进一步阅读 十一、可靠的安全最佳实践、参考和进一步使用 Ansible 的保管库,如何对变量和文件使用 Ansible Vault,Ansible Vault 单一加密变量,Ansible 拱顶在 Ansible 塔中的应用,设置和使用可扫描集群,
    Apache CN

  • Ansible2安全自动化-九、用于取证收集和恶意软件分析的自动化实验室设置 为隔离环境的实验室创建可行的行动手册,收集文件和域恶意软件识别和分类,病毒总应用编程接口工具设置,病毒总应用编程接口扫描恶意软件样本,设置布谷鸟沙盒环境,设置布谷鸟主机,设置布谷鸟客人,使用 Ansible 行动手册提交样品和报告,使用
    Apache CN

  • Ansible2安全自动化-八、Docker 容器的持续安全扫描 理解连续安全概念,使用 Ansible 自动化 Docker 容器的漏洞评估,安全 Docker 工作台,克莱尔,为了 Docker 安全,使用 Ansible Tower 进行计划扫描,锚,锚定的引擎服务设置,锚定 cli 扫描仪,使
    Apache CN

  • Ansible2安全自动化-四、日志监控和无服务器自动防御(AWS 中的弹性栈) 四、日志监控和无服务器自动防御AWS 中的弹性栈弹性叠层介绍,弹性搜索,logstash(日志记录),马纳人,搜索,我们为什么要使用弹性栈进行安全监控和警报?,设置弹性栈的先决条件,设置弹性栈,Logstash 集成,马纳人,弹性纤维,
    Apache CN

  • Ansible2安全自动化-五、使用 OWASP ZAP 实现网络应用安全测试自动化 安装 OWASP ZAP,安装 Docker 运行时,OWASP ZAP 坞站容器设置,处理容器的专用工具——Ansible 容器,配置 ZAP 基线扫描,运行易受攻击的应用容器,运行 OWASP 扫描程序基线扫描,针对网络应用和网站的
    Apache CN

  • Ansible2安全自动化-六、利用 Nessus 进行漏洞扫描 尼斯介绍,安装 Nessus 进行漏洞评估,配置 Nessus 进行漏洞扫描,对网络执行扫描,基本网络扫描,使用自动扫描运行扫描,设置自动用户,使用自动扫描运行扫描,列出当前可用的扫描和标识,使用扫描标识启动指定的扫描,存储结果,安装
    Apache CN

  • Ansible2安全自动化-七、应用和网络的安全强化 使用 CIS、STIGs 和 NIST 等基准强化安全性,使用 Ansible 行动手册强化基线操作系统,STIGs 在 Linux 主机自动安全强化方面的可替代角色,使用 Ansible Tower 对 OpenSCAP 进行持续的安
    Apache CN

  • Ansible2安全自动化-三、使用加密自动备份设置加固 WordPress WordPress 命令行界面,为什么要为这种设置负责?,一个完整的 WordPress 安装步骤,正在设置 nginx web 服务器,设置先决条件,建立 MySQL 数据库,为 WordPress 安装程序安装 PHP,使用命令行界
    Apache CN

  • Ansible2安全自动化-二、Ansible Tower、Jenkins 和其他自动化工具 调度工具支持自动化的下一个抽象,起床跑步,设置可平移的塔,设置 Jenkins,设置运行平台,安全自动化用例,添加行动手册,Ansible 的塔式配置,Jenkins Ansible 集成配置,运行平台配置,认证和数据安全,RBAC 代
    Apache CN

  • 近期文章

    更多
    文章目录

      推荐作者

      更多