lambda表达式

本文详细介绍了Java中的Lambda表达式及其使用规则,包括如何转换为函数式接口,强调Lambda必须对应一个函数式接口。同时,讨论了Lambda与匿名内部类的区别,并指出接口需为函数式接口才能接收Lambda。此外,还提及了多目标类型的Lambda表达式概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

lambda表达式

可以传值

​ Runnable r1 = () -> {System.out.println(“Hello Lambda!”);};

Object obj = r1;

但是不能这样 Object obj = () -> {System.out.println(“Hello Lambda!”);}; // ERROR! Object is not a functional interface!

必须显式的转型成一个函数式接口才可以:

Object o = (Runnable) () -> { System.out.println("hi"); }; // correct

一个λ表达式只有在转型成一个函数式接口后才能被当做Object使用。所以下面这句也不能编译:

System.out.println( () -> {} ); //错误! 目标类型不明

必须先转型:

System.out.println( (Runnable)() -> {} ); // 正确

假设你自己写了一个函数式接口,长的跟Runnable一模一样:

@FunctionalInterface
public interface MyRunnable {
    public void run();
}

那么

Runnable r1 =    () -> {System.out.println("Hello Lambda!");};
MyRunnable2 r2 = () -> {System.out.println("Hello Lambda!");};

都是正确的写法。这说明一个λ表达式可以有多个目标类型(函数式接口),只要函数匹配成功即可。
但需注意一个λ表达式必须至少有一个目标类型。

lambda表达式和匿名内部类是有区别的,如果你实现一个匿名内部类然后使用this指向,那么编译后会有2个文件,如果使用lambda表达式,使用this,输出则只有一个文件

image.png
在这里插入图片描述

Lambda方法体外部并没有匿名内部类,当然只能指向LambdaTest。**更准确地说,this是指向方法的调用者,是隐式传递的。**从这个角度看,Lambda和匿名内部类本质上还是不同的

接口要想接收Lambda表达式,必须是一个函数式接口。所谓函数式接口,最核心的特征是:有且只有一个抽象方法。

在这里插入图片描述

也就是说,如果你希望一个接口能接收Lambda表达式充当匿名类对象,那么接口必须仅有一个抽象方法,这是函数式接口的定义。通常我们可以在接口上加一个@FunctionalInterface检测,作用于@Override一样。但函数式接口和@FunctionalInterface注解没有必然联系。

comparto有2个抽象方法还可以使用,是因为有一个为Object的抽象类equals

联系。

Comparator有2个抽象方法还可以使用,是因为有一个为Object的抽象类equals

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值