入门
是什么
lambda表达式是jdk1.8的新特性,它本质上是一种匿名函数。
什么时候用
如果一个方法的参数是一个接口,一般来说我们使用这个方法的时候会使用匿名内部类。现在,我们则可以使用lambda表达式替代匿名内部类。
怎么用
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进行反编译。
lambda表达式执行方式
在代码运行的时候会在Test01中新建一个静态方法,静态方法中是lambda表达式中的代码,然后新建一个匿名内部类,在匿名内部类中覆盖重写接口中的方法,同时在其内调用新建的静态方法。
lambda表达式的省略格式
可以省略的内容:
- 入参的数据类型
- 如果大括号内只有一行代码,return 大括号 分号可以同时省略(注意:不能只省略一个)
- 如果小括号内只有一个参数可以省略小括号
使用lambda表达式的前提条件
- 方法参数必须是接口
- 借口内必须有且仅有一个抽象方法
如果一个接口有且仅有一个抽象方法,则这个接口即为函数式接口。
注解@FunctionInterface放在接口定义的上面,即表示其为函数式接口。
使用
使用lambda表达式的优点有很多,除了显而易见的简洁之外,还能从一定程度上避免内存泄漏,详情可见如下链接:
https://www.zhihu.com/question/447582599