【问题标题】:How does a function from a functional interface perform a lambda function?函数式接口中的函数如何执行 lambda 函数?
【发布时间】:2021-06-28 14:27:36
【问题描述】:

我正在尝试理解函数式接口和 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 函数的主体连接起来?只是继承和覆盖通常用于此,但这里编译器会它或如何?我很高兴有解释来理解这个问题

【问题讨论】:

  • 功能接口只有一个未实现的方法。 Lambda 只实现了一种方法。
  • 这能回答你的问题吗? Why Functional Interfaces in Java 8 have one Abstract Method? this one 还有一些其他细节。
  • @Turing85 但是如果 lambda 是一个函数式接口,那么它就不能有一个实现,不是吗?
  • lambda 表达式不是函数式接口,它实现函数式接口。
  • “但如果 lambda 是一个函数式接口” ... Turing85 不是这样写的,他们写的是“Lambda 实现正是一种方法” .

标签: java lambda


【解决方案1】:

在 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 表达式语法创建的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-25
    • 2013-02-26
    • 2017-11-22
    • 2017-02-17
    • 2016-10-16
    • 1970-01-01
    相关资源
    最近更新 更多