Lambda表达式强调的思想是尽量忽略面向对象的复杂语法,强调做什么而不是以什么形式去做
在我们想使用接口时,需要创建接口的实现类,然后实例化实现类的对象,调用对象来使用。
public interface Inter{
void show();
}
class InterImpl implements Inter{
public void show(){
System.out.println("接口")
}
}
class InterDemo{
public static void main(String[] args){
Inter i = new InterImpl();
i.show();
}
}
而 当我们想更简单一些,就会使用匿名内部类,
public interface Inter{
void show();
}
class InterDemo{
public static void main(String[] args){
Inter i = new Inter(){
public void show(){
System.out.println("内部类");
}
};
i.show();
}
}
然后想要再简单一点呢,就用到了Lambda表达式
public interface Inter{
void show();
}
class InterDemo{
public static void main(String[] args){
Inter i = () -> {System.out.println("Lambda表达式")};
};
i.show();
}
}
Lambda表达式的格式为:小括号传参数(),加上箭头->,加上代码块写方法体{}
一,省略模式:
1.参数类型可以省略,但是有多个参数的情况下不能只省略一个
2.如果参数有且只有一个,那小括号也是可以省略的
3.如果代码块语句只有一条,可以省略大括号和分号,但是当方法为带返回值的方法时return也需要省略
二,注意事项:
1.Lambda表达式必须要有接口,且接口中只有一种抽象方法是才能使用的
2.必须有上下文环境,才能推导出对应的接口
根据局部变量的赋值得知Lambda对应的接口:Runnable r = () ->System.out.println("表达式");
根据调用方法的参数得知Lambda对应的接口:new Thread(() -> System.out.println("表达式")).staty();
三,和匿名内部类的区别:
1.所需类型不同
匿名内部类:可以是接口,也可以是抽象类,还可以是具体类
Lambda:只能时接口
2.使用限制不同
如果接口中有且只有一个方法,那么两个都可以用
如果接口中有多个方法,那么只能用匿名内部类
3.实现原理不同
匿名内部类:编译之后,产生一个单独的class字节码文件
Lambda:编译后没有单独的class字节码文件。对应的字节码会在运行时动态生成