![](/img/trans.png)
[英]Lambda function without parameters - Cannot infer functional interface type
[英]How does a function from a functional interface perform a lambda function?
我正在尝试理解函数式接口和 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
的(匿名类)实例使用参数10
调用其test()
方法。 只是这个实例是使用 lambda 表达式语法创建的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.