功能接口,功能方法和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".
我使用 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".