四十五、Lambda
Lambda只能操作函数式接口
1、函数式接口
1.1 概述
只有一个抽象方法需要重写的接口,函数式接口。函数式接口是允许有其他的非抽象方法的存在例如静态方法,默认方法,私有方法。
为了标识接口是一个函数式接口,可以在接口之上加上一个注解: @FunctionalInterface 以示区别。
1.2 定义函数式接口:
@FunctionalInterface
public interface Swim {
public abstract void swimming();
}
2、格式
2.1 匿名内部类中重写swim()方法的代码分析
- 方法形式参数为空,说明调用方法时不需要传递参数
- 方法返回值类型为void,说明方法执行没有结果返回
- 方法体中内容,是我们具体要做的事情
goSwimming( new Swimming() {
public void swim() {
System.out.println("铁汁, 我们去游泳吧~");
}
});
2.2 Lambda表达式的代码分析
-
() : 里面没有内容,可以看成是方法形式参数为空
-
-> : 用箭头执行后面要做的事情
-
{} :包含一段代码,我们称之为代码块,可以看成是方法体中的内容
goSwimming(() -> {
System.out.println("铁汁, 我们去游泳吧~");
});
2.3 Lambda表达式格式
-
格式 :
( 形式参数 ) -> { 代码块 } -
形式参数:如果有多个参数,参数之间用逗号隔开;如果没有参数,留空即可
-
->:由英文中画线和大于符号组成,固定写法。代表指向动作
-
代码块:是我们具体要做的事情,也就是以前我们写的方法体内容
2.4 Lambda表达式省略模式
- 参数类型可以省略,但是有多个参数的情况下,不能只省略一个
- 如果参数有且有一个,那么小括号可以省略
- 如果代码块的语句只有一条,可以省略大括号和分号,甚至return
3、有形参有返回值的Lambda
代码案例:
public class Demo07ComparatorLambda {
public static void main(String[] args) {
Person[] array = {
new Person("古力娜扎", 19),
new Person("迪丽热巴", 18),
new Person("马尔扎哈", 20) };
Arrays.sort(array, (Person a, Person b) -> {
return a.getAge() - b.getAge();
});
for (Person person : array) {
System.out.println(person);
}
}
}
4、Lambda表达式和匿名内部类的区别
4.1 所属类型不同
- 匿名内部类:可以是接口,也可以是抽象类,还可以是具体类
- Lambda表达式:只能是接口
4.2 使用限制不同
- 如果接口中有且仅有一个抽象方法,可以使用Lambda表达式,也可以使用匿名内部类
- 如果接口中多于一个抽象方法,只能使用匿名内部类,而不能使用Lambda表达式
4.3 实现原理不同
- 匿名内部类:编译之后,产生一个单独的.class字节码文件
- Lambda表达式:编译之后,没有一个单独的.class字节码文件。对应的字节码会在运行的时候动态生成

浙公网安备 33010602011771号