先来个例子:
我们调用个接口,可以使用下面3种方式!这里主要说一下Lambda表达式。主要就是简化代码。
//接口
public interface Eatable {
void eat();
}
public class EatableDemo {
public static void main(String[] args) {
//写一个类,实现接口中的方法
Eatable e= new EarableImpl();
UserEatable(e);
//匿名内部类
UserEatable(new Eatable() {
@Override
public void eat() {
System.out.println("加油");
}
});
//lambda 表达式
UserEatable(()->{
System.out.println("你好");
});
}
//以接口为形参的方法
private static void UserEatable(Eatable e){
e.eat();
}
Lambda表达式的组成:
():里面没有内容,可以看成是方法形式参数为空,如果不为空的话,就直接写进去。
->:用箭头指向后面要做的事情。
{}:包含一段代码,我们称之为代码块,可以看作方法体中的内容。
格式:
(形式参数)->{代码块};
Lambda表达式的省略模式:
省略规则:
1.参数类型可以省略,但是多个参数的情况下,要不就都省略,要不就别省略。别只省略一个。
2.如果参数有且只有一个,那么小括号可以省略。
3.如果代码块的语句只有一条,可以省略大括号和番号,甚至是return。
Lambda表达式使用的注意事项:
1.使用Lambda必须要有接口,接口中必须只能有一个方法!
2.必须要有上下文环境,才能推导出Lambda对应的接口。
根据调用方法的参数得知Lambda对应的接口:new Thread(()->System.out.printIn("Lambda表达式")).start();
根据局部变量的赋值得知Lambda对应的接口:Runnable=()->System.out.printIn("Lambda表达式");
Lambda表达式和匿名内部类的区别:
所需类型不同:
匿名内部类:可以是接口,可以是抽象类,可以是具体类
Lambda表达式:只能是接口
使用限制不同:
如果接口中仅有一个抽象方法,可以使用Lambda表达式,也可以使用匿名内部类
如果接口中多于一个抽象方法,只能使用匿名内部类,不能使用Lambda表达式
实现原理不同:
匿名内部类:编译后会产生一个单独的.class字节码文件
Lambda表达式:编译后,没有单独生成.class字节码文件。对应的字节码会在运行的时候动态生成。