用lambda表达式实现具有两个抽象方法的接口

在Java 8中引入了lambda表达式来帮助减少样板代码。 如果接口只有一个方法,它可以正常工作。 如果它由多个方法组成,那么这些方法都不起作用。 我如何处理多种方法?

我们可以参考下面的例子

public interface I1()
{
    void show1();
    void show2();
}

那么主要函数的结构将在主体中定义方法的结构是什么?


Lambda表达式只能用于Eran所说的功能接口,但如果您真的需要接口中的多个方法,则可以将修饰符更改为defaultstatic ,并在必要时在其实现的类中重写它们。

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继承了show1show2 ,因此不能成为功能接口。

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();
}

Lambda表达式只能用于实现函数接口,它们是具有单个抽象方法的接口。 具有两个抽象方法的接口不能由lambda表达式实现。


我通常直接在界面中创建一个静态工厂方法:

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"));
链接地址: http://www.djcxy.com/p/39859.html

上一篇: Implementing an interface with two abstract methods by a lambda expression

下一篇: mostly data structure to compress and search source code