乐趣区

关于lambda:Lamda拉姆达表达式演化过程

简介

HI!小伙伴们,好久没见了,4 月份开始断更,中途有点事儿,明天开始更新了,整顿一篇 Lamda 表达式演化过程,心愿喜爱的判若两人的反对!

传统汇合过滤

当初有 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(); 最终打印输出后果如下:

代码的后果咱们输入了,后果输入没有问题,然而看上去有些臃肿,因为除了过滤条件外,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 以上版本反对哦!

总结


好啦,明天咱们就讲到这里,心愿大家有疑难能够发问,欢送和我交换。我是【公众号:叫练 ,边叫边练 喜爱的能够加关注哦!再次感激大家的观看反对。

退出移动版