Lambda表达式

没有内部接口类,可不可以直接使用Lambda表达式?

 

 

 不能,会报错。


Lambda表达式是否可以配合内部接口使用?

 

 可以


Lambda表达式是否只能搭配内部接口使用?

可以没有内部接口

更正,必须是搭配内部接口使用

 

 Collectons.sort();

这个方法中第二个参数是一个比较器,它是一个接口?虽然在自己写的代码中未出现Comparator接口,但是我们把Lambda表达式赋给这个接口了,所以还是搭配了接口使用。

此外的话,既然使用了Collections,导入了它的包,那就有了这个接口了。可以查看源代码,源代码应该定义了这个接口

 

 


如果没有内部接口,能不能直接在其它函数的构造参数里使用Lambda表达式?

 

 当我把Lambda表达式赋给int类型的参数时,报错提示说;int 不是一个在起作用的接口。

其实上述语句等价于:int s=()->5;   log(s);

而根据之前的测试,Calculator c=(a,b)->a+b;这样的赋值方式是可以的,这几乎说明了,Lambda表达式只可以赋给接口。


为什么可以出现将一个Lambda表达式赋值给一个接口这样的写法?

 

 

 

 两种写法效果是等效的,因原先的写法太麻烦,就简化了写法,Lambda表达式其本质上只是一个语法糖,由编译器推断并转换为常规的代码。

第一种写法分步写:Comparator c=new Comparator<String>(){

.........

}

所以才有Comparator c=(o1,o2)->{...}这样的写法。

而第一种的用法叫什么呢?叫匿名内部类?


 

匿名内部类:需要实现一个接口,实现类只会用到一次,就不用再去写一个具体的类实现接口了。直接写个匿名内部类。


这种接口需要实现的方法是否只有一个?

如果是匿名内部类原生表示的话,应该是可以的,想象一下重写多个方法,也不是不能表达出来。

但是如果有多种需要重写的方法,对于Lambda表达式该如何表示呢?如何在接口中规定需要重写的方法呢?

抽象方法必须被重写。

什么方法可重写可不重写?什么方法必须重写?什么方法不用重写?

未完待续。。。

在jdk8之后,接口有了新特性。接口中可以包含实现的方法。

用static修饰的方法,不能被重写。

用default修饰的方法,可以重写可以不重写。

没有这两种修饰(abstract),就必须重写。

 


 

使用Lambda表达式去表达的几个特性。

 可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。

可选的参数圆括号:当只有一个参数时,无需定义圆括号,但如果有多个参数则需要定义圆括号。

可选的大括号:如果主体包含了一个语句,就不需要使用大括号。

可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值。

posted @ 2021-09-27 17:25  北征愚人  阅读(40)  评论(0编辑  收藏  举报