我们看到最后的Comparator接口,声明了两个方法,好像不符合函数接口的定义,但Comparator确实是函数接口。这个是因为equals方法是Object的,所有的接口都会声明Object的public方法(虽然大多是隐式的)。所以,Comparator显式的声明了equals不影响它依然是个函数接口。
虽然Lambda虽然可以当作是Object类型,但需要显式转换才行。
我们可以用一个Lambda表达式为一个函数接口赋值:
Runnable r1 = () -> {System.out.println(“Hello Lambda!”);};
然后再赋值给一个Object:
Object obj = r1;
但却不能这样干:
Object obj = () -> {System.out.println(“Hello Lambda!”);};
// ERROR! Object is not a functional interface!
必须显式的转型成一个函数接口才可以:
Object o = (Runnable) () -> { System.out.println(“Hello Lambda!”); };
一个Lambda表达式只有在转型成一个函数接口后才能被当做Object使用。所以下面这句也不能编译:
System.out.println( () -> {} ); //错误! 目标类型不明
必须先转型:
System.out.println( (Runnable)() -> {} ); // 正确
我们可以定义一个无参数,无返回值的接口,类似Runnable
@FunctionalInterface
public interface MyRunnable {
public void run();
}
那下面的写法,都是正确的
Runnable r1 = () -> {System.out.println(“Hello Lambda!”);};
MyRunnable r2 = () -> {System.out.println(“Hello Lambda!”);};
这说明一个Lambda表达式可以有多个目标类型(函数接口),只要函数匹配成功即可。
但需注意一个Lambda表达式必须至少有一个目标类型。
Lambda的域以及访问限制
域即作用域,Lambda表达式中的参数列表中的参数在该Lambda表达式范围内(域)有效。在作用Lambda表达式内,可以访问外部的变量:局部变量、类变量和静态变量,但操作受限程度不一。
1、访问局部变量
在Lambda表达式外部的局部变量会被JVM隐式的编译成final类型,因此只能访问外而不能修改。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9qeb0fvC-1651218054079)(https://uploader.shimo.im/f/jr58PED 《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》无偿开源 徽信搜索公众号【编程进阶路】 jvrAoTNuI.png!thumbnail)]
2、访问静态变量和成员变量
在Lambda表达式内部,对静态变量和成员变量可读可写。
内置函数式接口
小伙伴们有没有发现,如果使用Lambda表达式,还是需要我们自己写一个接口定义的,其实很多接口无非是入参类型和返回值不一样而已,所以Java给我们提供了几个常用的标准函数接口:
Consumer< T >con 消费型接口: void accept(T t);
Supplier< T >sup供给型接口 : T get();
Function< T , R >fun 函数型接口 : R apply (T t);
Predicate< T >: 断言型接口 : boolean test(T t);
1、Consumer 消费型接口
接口中的方法为 void accept(T t),1个参数,无返回值。调用方要传入值,而不需要返回,形象比喻成消费型
这个就是对传入num参数值,进行相关的处理(消费)。到底进行处理,具体就在
(num) -> System.out.println(“消费了” + num)
上面的代码中,是一个典型的1个参数,无返回值的消费;如果没有内置的函数接口,那我们就需要自己定义一个,如:
interface MyConsumer{
void doFunction(T t);
}
我们发现和内置函数接口,没有什么区别,就是接口名和方法名称不一样而已,其实本质是一样的,这就是为什么Java会提供一些内置的函数,这样可以减少大量的代码。
2、Supplier供给型接口
接口中的方法 T get(),无参数,有返回值;不需要对方给参数,而是一直返回给对方,形象定义为供给型接口
ier供给型接口**
接口中的方法 T get(),无参数,有返回值;不需要对方给参数,而是一直返回给对方,形象定义为供给型接口