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表达式去表达的几个特性。
可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。
可选的参数圆括号:当只有一个参数时,无需定义圆括号,但如果有多个参数则需要定义圆括号。
可选的大括号:如果主体包含了一个语句,就不需要使用大括号。
可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值。
本文来自博客园,作者:北征愚人,转载请注明原文链接:https://www.cnblogs.com/xukd/p/15343921.html