30

Java 8 では、定型コードの削減に役立つラムダ式が導入されました。インターフェイスにメソッドが 1 つしかない場合は、正常に機能します。複数のメソッドで構成されている場合、どのメソッドも機能しません。複数のメソッドを処理するにはどうすればよいですか?

次の例に行くかもしれません

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

それでは、メイン自体でメソッドを定義するためのメイン関数の構造はどうなるでしょうか?

4

4 に答える 4

36

Eran が述べたように、ラムダ式は関数型インターフェイスでのみ使用できますが、インターフェイス内で複数のメソッドが本当に必要な場合は、必要に応じて修飾子を変更し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継承するため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();
}
于 2016-03-26T09:11:41.713 に答える
14

ラムダ式は、単一の抽象メソッドを持つインターフェースである機能インターフェースを実装するためにのみ使用できます。2 つの抽象メソッドを持つインターフェイスは、ラムダ式では実装できません。

于 2016-03-26T09:06:07.027 に答える
13

私は通常、インターフェイスで静的ファクトリ メソッドを直接作成します。

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"));
于 2016-03-26T10:24:31.853 に答える
4

いつでもコンポジションを使用できます。

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());
于 2016-03-26T09:15:49.810 に答える