功能接口,功能方法和lamda?

Functional Interface , Functional Method and lamda?

我使用 lambda 函数中的函数式方法实现了函数式接口。一切正常,除了我得到必须实现这个继承的抽象方法(在我的例子中是功能方法)的错误。在这里我很困惑。我使用 lambda 函数来实现这个功能方法,为什么我要再次实现这个方法。 功能方法的实现是如何正确完成的? 我的代码:

interface MyFunction {
  int getValue(int num); }

class Factorial implements MyFunction {
  public static void main (String [] args) {
        MyFunction myFactorialFunc = (num) -> {
            int fact = 1;
            for(int i = 1; i <= num; i++){
                fact = i * fact;
            }
            return fact;
        };
        System.out.println(myFactorialFunc.getValue(7));
}
}

感谢您的帮助。 :)

您定义了 Factorial class 来实现 MyFunction,但它没有实现该接口 (int getValue(int num);) 的方法。

在您的 main 中使用 lambda 表达式实现的 MyFunction 实例没有为您的 Factorial class.

实现该接口

只需将其更改为:

class Factorial {
    public static void main (String [] args) {
        MyFunction myFactorialFunc = (num) -> {
            int fact = 1;
            for(int i = 1; i <= num; i++){
                fact = i * fact;
            }
            return fact;
        };
        System.out.println(myFactorialFunc.getValue(7));
    }
}

我想您一定从某个地方听说过 "you can implement single-method interfaces with a lambda expression!" 并通过编写这段代码来尝试它,但一直误解它的意思。

Lambda 表达式实际上 不允许您在不声明所需方法的情况下编写class MyClass implements SomeInterface。对于编译器来说,Factorial只声明了一个main方法,没有getValue方法,所以没有实现MyFunction接口。

不过您的代码确实证明了 "you can implement single-method interfaces with a lambda expression"。在 main 方法中,您将 lambda 表达式分配给类型为 MyFunction:

的变量
MyFunction myFactorialFunc = (num) -> {
    int fact = 1;
    for(int i = 1; i <= num; i++){
        fact = i * fact;
    }
    return fact;
};

通常,您必须将 MyFunction 的实现放在 = 的右侧,不是吗?但是现在,您可以只使用 lambda 表达式!这是因为 lambda 表达式的签名与接口中单个方法的签名匹配,所以编译器会 "yeah, that's fine, I'll just use this as the implementation of that method".