现在我正在学习Java,我编写了这样的代码:
public class LambdaClass {
public static void main(String args[]) {
Plane pl = () -> {
System.out.println("The plane is flying...");
};
pl.fly();
}
interface Plane {
void fly();
//void speedUp(); if I uncomment this, it is an error
}
}
我感兴趣的是lambda表达式和Plane接口方法之间的联系是什么,我的意思是lambda表达式的body语句现在分配给了pl实例的fly方法,为什么会这样呢?
答案 0 :(得分:2)
使用接口的lambda实现的一个要求是接口功能,即只有一个方法。
当您使用单个方法fly()
定义接口时,Java认为它是有效的,并允许您使用lambda实现它。但是,添加第二个方法后,使用lambdas变得不可能,因为编译器需要知道您希望实现的两种方法中的哪一种。
解决此问题的一种方法是为每个方法定义单独的functionali接口,然后将它们组合成更大的接口,如下所示:
interface Flyable {
void fly();
}
interface WithSpeedIncrease {
void speedUp();
}
interface WithSpeedDecrease {
void slowDown();
}
interface Plane extends Flyable, WithSpeedIncrease, WithSpeedDecrease {
}
答案 1 :(得分:0)
Lambda表达式替代实现功能接口的匿名内部类。
functional interface是一个只有一个非默认方法的接口,例如Plane
接口。
你的lambda表达式等同于一个匿名内部类,它使用lambda表达式实现该接口的方法。
public static void main(String args[]) {
Plane pl = new Plane() {
@Override
public void fly() {
System.out.println("The plane is flying...");
}
};
pl.fly();
}
lambda表达式更加简洁。
如果取消注释接口中的第二种方法,它不会编译的原因是它将不再是一个功能接口。 lambda表达式只能为一个方法提供隐含的方法体。如果接口中有2个方法,那么编译器就不会有第二个方法的实现,更不用说能够在等效方法之间进行选择。