Lambda表达式
格式: (形式参数) -> {代码块}
形式参数: 如果由多个形式参数, 用逗号隔开, 没有则留空
->: 固定写法, 代表指向动作
代码块: 具体要做的事情, 方法体内容```
使用前提:
Ⅰ.有一个接口
Ⅱ.有且仅有一个抽象方法
//Lambda表达式测试, 使用前提有一个接口, 接口有且仅有一个抽象方法
//创建一个方法, 方法的形式参数为接口
// 1.主方法调用吃东西方法, 传入学生
Animal a = new Student();
eat(a);
// 2.匿名内部类方式
eat(new Student() {
public void eat() {
System.out.println("学生会吃东西..");
}
});
// 3.Lambda表示式
eat(()->{
System.out.println("学生会吃东西....");
});
Lambda表达式的省略模式
- 参数类型可以省略, 但是多个参数的情况下, 不能只省略一个
- 如果参数有且仅有一个, 那么小括号可以省略
- 如果代码块的语句只有一条, 可以省略大括号和分号, 甚至是return
// 1.完整方式书写
useAdd((int x, int y) -> {
return x + y;
});
// 2.省略参数
useAdd((x,y) -> {
return x + y;
});
// 3.参数有两个, 省略大括号和分号和return
useAdd((x,y) -> x + y);
// 4.参数有一个, 可以省略小括号, 大括号, 和分号
useFlying(s -> System.out.println(s));
注意事项
- 使用Lambda必须要有接口, 并且接口中有且仅有一个抽象方法
- 必须有上下文环境, 才能推导出Lambda对应的接口
//根据局部变量的赋值, 得知Lambda对应的接口
Runnable r = () -> System.out.println("Lambda表达式");
//根据调用方法的参数, 得知Lambada对应的接口
new Thread(() -> System.out.println("Lambda表达式")).start();
Lambda表达式和匿名内部类的区别
所需类型不同
- 匿名内部类: 可以是接口, 抽象类, 具体的类
- Lambda: 只能是接口
使用限制不同
- 匿名内部类: 接口中多个抽象方法都可以实现
- Lambda: 接口中只有一个抽象方法才可以实现
实现原理不同
- 匿名内部类: 编译之后, 产生一个单独的.class文件
- Lambda: 编译之后, 没有产生单独的.class文件, 对应的字节码文件会在编译的时候动态生成