概述
Lambda表达式的使用前提 :
1、必须有接口,且接口中有且仅有一个抽象方法 。
2、必须有上下文环境,才能推倒出Lambda对应的接口,比如在主方法main中写()-> System.out.print("OK"),没人知道什么意思,也没有意义,但是如果写成Runnable r = ()-> System.out.print("OK"),就知道他是实现Runnable接口的,接下来就可以新建一个线程来启动程序:new Thread(r).start()。或者直接写成:new Thread( () -> System.out.print("OK") ).start(),也能明白其意思。
在main主方法里面用Lambda表达式:()->{需求或解决方案},相当于在main主方法里面的匿名内部类里面重写方法,以实现需求或解决方案。上面蓝色带下划线的部分实际上是一个抽象方法的重写,()内的参数即是抽象方法的参数,{}里面的内容即是抽象方法的方法体。
主要目的是省去了 新建一个实现类来实现接口,把实现接口的重写方法,放在主方法里面来重写了,用Lambda表达式的写法比匿名内部类的写法,简化了很多。
调用接口时,直接新建一个方法fun(interface),把接口当做参数,再在主方法里调用此方法fun(interface ),同时实现interface内的方法,即需求。亦即:在在Lambda表达式()里面放置接口内方法的参数,在Lambda表达式方法体{...}里面实现接口方法,以替代接口的实现类。{...}结果,作为参数传递给fun(),可以理解为该参数是接口的实现类对象,因为{...}就是替代接口的实现类的。
代码示例如下:
public interface Eatable {
void eat();
}
public class EatTest {
public static void main(String[] args) {
fun(new Eatable() {
@Override
public void eat() {
System.out.println("羊吃草1");
}
});//羊吃草1
fun(()->{
System.out.println("羊吃草2");
});//羊吃草2
}
public static void fun(Eatable e){
e.eat();
}
}
如果接口里面的方法有参数,在Lambda表达式的()里面加上参数即可,多个参数之间有逗号隔开:(参数1,参数2)->{...},
{...}代码块里面的内容,实际上就是接口实现类里面重写的方法体,用Lambda表达式之后,有两个好处:
1、可以省去了接口实现类;2、简化了匿名内部类的繁琐。直接在主方法里面实现方法体了。
注意:
1、表达式的参数类型可以省略,且必须同时省略,或都不省略,不能只省略一个而其他的不省略。如(int a, int b)可以写成 :(a, b)->{...}。
2、如果只有一个参数,Lambda表达式的(parameter)可以省略括号直接写参数:parameter。
3、如果{...}代码块的语句只有一条,(1)可以省略大括号和分号: parameter -> 方法体... 。(2)如果{...}代码块里面有返回值,需要return result ,return也要省略:parameter -> result 。 例子中的调用构造方法就可以写成:fun(parameter -> result);
另外注意:匿名内部类与Lambda表达式的区别:
1、所需类型不同。匿名内部类:可以是接口、抽象类、具体类。Lambda表达式:只能是接口
2、使用限制不同。如果接口中有且仅有一个抽象方法,可以使用Lambda表达式,也可以使用匿名内部类。 如果接口中多于一个抽象方法,只能使用匿名内部类,而不能使用Lambda表达式
3、实现原理不同。匿名内部类虽然跟使用Lambda效果一样,但是会自动多生成一个.class字节码文件,只是我们在写的时候没有发觉,这也是匿名内部类跟Lambda的区别,Lambda的字节码文件会动态生成,我们看不见,这个知道即可,在具体编程中感受不到,对于初学者或一般开发作业中不必过多关注。
代码示例详见:https://blog.csdn.net/timon777/article/details/103935384
最后
以上就是细腻耳机为你收集整理的Lambda表达式使用及注意事项的全部内容,希望文章能够帮你解决Lambda表达式使用及注意事项所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复