假设我有接口A ,它只有一个声明如下的方法:
interface A{
void print();
}
现在使用旧的java风格,我们将以匿名的方式使用它,如下所示:
new A() {
@Override
public void print() {
System.out.println("in a print method");
}
};
并且使用lambda表达式我们将如下所示使用它:
() -> "A1";
现在我的问题是接口A是否有两个声明如下的方法:
interface A{
void print();
void display();
}
及其旧的匿名函数利用方式如下:
new A() {
@Override
public void print() {
System.out.println("in print");
}
@Override
public void display() {
System.out.println("in display");
}
};
现在如何将display方法转换为lambda?或者我们不被允许这样做;如果不是为什么不呢?为什么我们不能像
那样代表它print() - > "印刷"
和
display() - > "显示"
答案 0 :(得分:8)
你不能。 lambda表达式只能用于" functional" interface - 只有一个非默认方法的接口。
对于"为什么"你不得不问语言设计师,但我的看法是lambda表达式是单个代码块的简写,而一组作为一个单元处理的相关块会更好代表一个适当的阶级。对于像问题中的示例一样的情况,真正的答案是修改API,以便不使用带有两个方法的单个A
接口,而是为两个函数APrinter
使用两个独立的功能接口, ADisplayer
,然后可以由单独的lambdas实现。
答案 1 :(得分:2)
您可以通过为两种方法之一提供默认实现,将A“转换”为功能界面,例如:
public interface B extends A {
default void print() {}
}
B lambda = () -> displaySomething();
或者,您可以提供a static factory。