我们看到了最后一个,函数接口的定义似乎不符合,但Comparator。这个是,所有的接口。所以,Comparator显式的。 虽然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表达式外部的局部变量将被接受JVM隐式编译成final类型只能访问而不能修改。
[外链图片存储失败,源站可能有防盗链机制,建议保存图片直接上传(img-9qeb0fvC-1651218054079)(https://uploader.shimo.im/f/jr58PED jvrAoTNuI.png!thumbnail)]
在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);
接口中的方法是 void accept(T t),
这是传入num参数值,相关处理(消费)。处理的具体内容是
(num) -> System.out.println(“消费了” num)
上面的代码是典型的
interface MyConsumer{ void doFunction(T t); }
与内置函数接口
接口中的方法 T get(),
无参数,有返回值; ier供给型接口** 接口中的方法 T get(),不需要对方给出参数,而是一直返回给对方 ,图像定义为供给接口无参数,有返回值; 不需要对方给出参数,而是一直返回给对方 ,图像定义为供给接口