通过 lambda 表达式实现具有两个抽象方法的接口
Implementing an interface with two abstract methods by a lambda expression
在 Java 8 中引入了 lambda 表达式 以帮助减少样板代码。如果接口只有一种方法,它工作正常。如果它包含多个方法,则 none 个方法有效。如何处理多种方法?
我们可以去下面的例子
public interface I1()
{
void show1();
void show2();
}
那么在main函数中定义方法的main函数的结构是什么?
Lambda 表达式只能用于实现功能接口,即具有单个抽象方法的接口。具有两个抽象方法的接口不能由 lambda 表达式实现。
正如 Eran 所说,Lambda 表达式只能用于功能接口,但如果您确实需要接口中的多个方法,您可以将修饰符更改为 default
或 static
并在类 在必要时实施它们。
public class Test {
public static void main(String[] args) {
I1 i1 = () -> System.out.println(); // NOT LEGAL
I2 i2 = () -> System.out.println(); // TOTALLY LEGAL
I3 i3 = () -> System.out.println(); // TOTALLY LEGAL
}
}
interface I1 {
void show1();
void show2();
}
interface I2 {
void show1();
default void show2() {}
}
interface I3 {
void show1();
static void show2 () {}
}
继承
你不应该忘记继承的方法。
这里,I2
继承了show1
和show2
,不能成为函数式接口。
public class Test {
public static void main(String[] args) {
I1 i1 = () -> System.out.println(); // NOT LEGAL BUT WE SAW IT EARLIER
I2 i2 = () -> System.out.println(); // NOT LEGAL
}
}
interface I1 {
void show1();
void show2();
}
interface I2 extends I1 {
void show3();
}
注释
为了确保你的界面是函数式界面,你可以添加下面的注解@FunctionalInterface
@FunctionalInterface <------- COMPILATION ERROR : Invalid '@FunctionalInterface' annotation; I1 is not a functional interface
interface I1 {
void show1();
void show2();
}
@FunctionalInterface
interface I2 {
void show3();
}
您可以随时使用组合:
public inteface I1 {
void show1();
void show2();
}
public class I1Adapter {
private final Runnable r1,r2;
public I1Adapter(Runnable r1, Runnable r2) {this.r1=r1; this.r2=r2;}
public void show1() {r1.run();}
public void show2() {r2.run();}
public static I1Adapter compose(Runnable r1, Runnable r2) {
return new I1Adapter(r1,r2);
}
}
不可以(使用静态导入):
I1 i1 = compose(()->foo(), ()->bar());
我一般直接在接口中创建静态工厂方法:
public inteface I1 {
void show1();
void show2();
public static I1 of(Runnable show1, Runnable show2) {
return new I1() {
void show1() { show1.run(); }
void show2() { show2.run(); }
};
}
}
用法:
I1 i1 = I1.of(() -> System.out.println("show1"), () -> System.out.println("show2"));
在 Java 8 中引入了 lambda 表达式 以帮助减少样板代码。如果接口只有一种方法,它工作正常。如果它包含多个方法,则 none 个方法有效。如何处理多种方法?
我们可以去下面的例子
public interface I1()
{
void show1();
void show2();
}
那么在main函数中定义方法的main函数的结构是什么?
Lambda 表达式只能用于实现功能接口,即具有单个抽象方法的接口。具有两个抽象方法的接口不能由 lambda 表达式实现。
正如 Eran 所说,Lambda 表达式只能用于功能接口,但如果您确实需要接口中的多个方法,您可以将修饰符更改为 default
或 static
并在类 在必要时实施它们。
public class Test {
public static void main(String[] args) {
I1 i1 = () -> System.out.println(); // NOT LEGAL
I2 i2 = () -> System.out.println(); // TOTALLY LEGAL
I3 i3 = () -> System.out.println(); // TOTALLY LEGAL
}
}
interface I1 {
void show1();
void show2();
}
interface I2 {
void show1();
default void show2() {}
}
interface I3 {
void show1();
static void show2 () {}
}
继承
你不应该忘记继承的方法。
这里,I2
继承了show1
和show2
,不能成为函数式接口。
public class Test {
public static void main(String[] args) {
I1 i1 = () -> System.out.println(); // NOT LEGAL BUT WE SAW IT EARLIER
I2 i2 = () -> System.out.println(); // NOT LEGAL
}
}
interface I1 {
void show1();
void show2();
}
interface I2 extends I1 {
void show3();
}
注释
为了确保你的界面是函数式界面,你可以添加下面的注解@FunctionalInterface
@FunctionalInterface <------- COMPILATION ERROR : Invalid '@FunctionalInterface' annotation; I1 is not a functional interface
interface I1 {
void show1();
void show2();
}
@FunctionalInterface
interface I2 {
void show3();
}
您可以随时使用组合:
public inteface I1 {
void show1();
void show2();
}
public class I1Adapter {
private final Runnable r1,r2;
public I1Adapter(Runnable r1, Runnable r2) {this.r1=r1; this.r2=r2;}
public void show1() {r1.run();}
public void show2() {r2.run();}
public static I1Adapter compose(Runnable r1, Runnable r2) {
return new I1Adapter(r1,r2);
}
}
不可以(使用静态导入):
I1 i1 = compose(()->foo(), ()->bar());
我一般直接在接口中创建静态工厂方法:
public inteface I1 {
void show1();
void show2();
public static I1 of(Runnable show1, Runnable show2) {
return new I1() {
void show1() { show1.run(); }
void show2() { show2.run(); }
};
}
}
用法:
I1 i1 = I1.of(() -> System.out.println("show1"), () -> System.out.println("show2"));