繁体   English   中英

函数式接口中的函数如何执行 lambda 函数?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM