java - 函数式接口中的函数如何执行 lambda 函数?
问题描述
我正在尝试理解函数式接口和 lambda 函数。我找不到关于函数式接口中的函数如何将其与 lambda 函数连接起来的解释,也就是说,假设有这样一个函数式接口
@FunctionalInterface
interface MyPredicate {
boolean test(Integer value);
}
现在我们将函数接口的变量分配给 lambda 函数:
public class Tester {
public static void main(String[] args) throws Exception {
MyPredicate myPredicate = x -> x > 0;
System.out.println(myPredicate.test(10)); //true
}
}
我完全想知道为什么打电话时myPredicate.test(10)
正在拨打电话x > 0
。也就是说,我是否正确理解,当我们分配一个 lambda 函数时,编译器会以某种方式将函数接口中的函数与 lambda 函数的主体连接起来?只是继承和覆盖通常用于此,但这里编译器会它或如何?我很高兴有解释来理解这个问题
解决方案
在 Java8 之前的术语中,lambda 表达式到底是什么?
它是实现当前上下文所需接口的匿名类的实例。
所以,要了解
MyPredicate myPredicate = x -> x > 0;
我们必须考虑一些不同的方面。
在这里,需要 lambda 表达式x -> x > 0
来给出与MyPredicate
. 因此,通过考虑使用表达式的上下文,它等价于
MyPredicate myPredicate = new MyPredicate() {
boolean test(Integer whateverName) {
// some method body
}
};
现在,lambda 表达式填充了该方法的主体。该x ->
部分定义了参数名称,所以现在我们有了
MyPredicate myPredicate = new MyPredicate() {
boolean test(Integer x) {
// some method body
}
};
并且x > 0
定义了主体和要返回的值:
MyPredicate myPredicate = new MyPredicate() {
boolean test(Integer x) {
return x > 0;
}
};
所以,当你打电话时myPredicate.test(10)
,没有什么特别的事情发生。中的(匿名类)实例使用参数调用myPredicate
其方法。只是这个实例是使用 lambda 表达式语法创建的。test()
10
推荐阅读
- reactjs - Reactjs、Nextjs、Nestjs、GraphQL、PostgreSQL、RabbitMQ 和 Kafka 如何协同工作?
- node.js - 从 api 中提取数据并存储在 mongo
- r - 基于 r 中的两组随机抽样
- findbugs - 如果 MapStruct 中的源值为 null,则抛出 NPE
- javascript - 如何使用 CSS、HTML、JavaScript 和 jQuery 将输入单元格添加到转置表中?
- c++ - 如何在 C++ 中检查位?
- c++ - 访问向量中相同父结构的成员时出现问题
- postgresql - Postgres 恢复失败,出现“意外的 GIN 叶操作:0”
- python - 从匹配的列表列表创建 JSON 文件
- lambda - 如何从无服务器构建中获取 lambda URL 到静态 create-react-app