大家好,这里是教授.F
目录
引入:
什么情况下使用/使用前提:
标准格式:
实现原理:
省略格式:
引入:
lambda表达式就是简介的书写我们的匿名内部类。Lambda相当于对接口的抽象方法的重写。
什么情况下使用/使用前提:
1.方法的参数或局部类型必须为接口才能使用
2.接口中有且仅有一个抽象方法
在jak8中:只有一个抽象方法的接口称为函数式接口,我们就可以使用lambda
@FunctionalInterface //这个注解是检测这个接口是不是只有一个抽象方法
标准格式:
(o1,o2) -> Integer.compare(o1,o2);
格式:
-> :lambda操作符 或 箭头操作符
->左边:lambda形参列表(其实就是接口中的抽象方和形参列表)
->右边:lambda体(其实就是重写的抽象方法的方法体)
实现原理:
lambda本质上就是对接口中方法的重写。
匿名内部类在编译后会形成一个class文件。
lambda在编译后并没有形成一个新类。
lambda在运行时会生成一个内部类:
1.在类中新增一个方法,这个方法的方法体就是lambda表达式中的代码
2.还会形成匿名内部类,实现接口,重写抽象方法
3.在重写方法中,会调用新生成的方法。
省略格式:
1.小括号内参数类型可以省略
2.如果小括号内有且仅有一个参数,则小括号可以省略
3.如果大括号内有且仅有一个语句,可以同时省略大括号、return关键字及语句分号
Lambda和匿名内部类对比:
1.所需的类型不同:
匿名内部类需要哦的类型是类、抽象类、接口
Lambda需要的类型必须是接口
2.抽象方法的数量不一样:
匿名内部类所需的接口中抽象方法的数量随意
Lambda表达式所需的接口只能有一个抽象方法
3.实现原理不同
匿名内部类是在编译后形成一个class类
Lambda表达式是在程序中运行形成动态生成class