lambda表达式是jdk1.8的新特性,它本质上是一种匿名函数。
如果一个方法的参数是一个接口,一般来说我们使用这个方法的时候会使用匿名内部类。现在,我们则可以使用lambda表达式替代匿名内部类。
(参数列表) -> {方法语句}
首先我们新建一个接口test
public interface test { void getTest(); }
然后我们新建一个带有主方法的类Test01
public class Test01 { public static void main(String[] args) { //匿名内部类方式调用接口 getStudent(new test() { @Override public void getTest() { System.out.println("hello"); } }); //lambda表达式调用接口 getStudent(() -> { System.out.println("hello lambda"); }); } public static void getStudent(test name){ System.out.println("getStudent 执行了"); name.getTest(); } }
在代码编译的时候,会生成一个class文件。可使用luyten进行反编译。
在代码运行的时候会在Test01中新建一个静态方法,静态方法中是lambda表达式中的代码,然后新建一个匿名内部类,在匿名内部类中覆盖重写接口中的方法,同时在其内调用新建的静态方法。
可以省略的内容:
如果一个接口有且仅有一个抽象方法,则这个接口即为函数式接口。
注解@FunctionInterface放在接口定义的上面,即表示其为函数式接口。
使用lambda表达式的优点有很多,除了显而易见的简洁之外,还能从一定程度上避免内存泄漏,详情可见如下链接:
https://www.zhihu.com/question/447582599