对于项目中使用了lambda表达式的代码,它的执行顺序有时候记不住,写篇文章记录一下。
一、基础数据准备
定义学生类
public class Student {private String name;private Integer age;public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}
}
自定义一个函数式接口ElementVerify
@FunctionalInterface
public interface ElementVerify<T> {String verify(T t);
}
二、测试执行顺序
Demo类
public class Demo {private static String execute(Student stu, ElementVerify<Student> elementVerify) {System.out.println("----第一步,开始执行execute----");String result = elementVerify.verify(stu);System.out.println(result);System.out.println("---第四步,执行execute完成----");return "success";}public static void main(String[] args) {Student student = new Student();student.setName("UMR");student.setAge(26);System.out.println("---即将执行execute---");execute(student, ((Student stu) -> {System.out.println("----第二步,校验年龄(start)----");if (stu.getAge() > 15) {}return "----第三步,校验年龄(end)----";}));}}
main方法里调用的execute写了一大坨,其实只是创建一个匿名内部类,实现了ElementVerify的方法,execute方法中必须手动去调用ElementVerify接口的verify方法,才会去执行传入的匿名内部类的实现方法。
匿名内部类的实现方法,如果不去主动调用,即便传入的时候实现了该方法,也不会去执行。
比如,我屏蔽execute方法中对verify的调用,其他保持不变。
public class Demo {private static String execute(Student stu, ElementVerify<Student> elementVerify) {System.out.println("----第一步,开始执行execute----");//屏蔽该方法
// String result = elementVerify.verify(stu);
// System.out.println(result);System.out.println("---第四步,执行execute完成----");return "success";}public static void main(String[] args) {Student student = new Student();student.setName("UMR");student.setAge(26);System.out.println("---即将执行execute---");execute(student, ((Student stu) -> {System.out.println("----第二步,校验年龄(start)----");if (stu.getAge() > 15) {}return "----第三步,校验年龄(end)----";}));}}
执行main方法
可以看见,屏蔽了之后,即使传入了匿名内部类,也没有去执行它里面的实现方法。