引数も戻り値もないJava 8機能インターフェース


109

何も取らず、何も返さないメソッドのJava 8機能インターフェースとは何ですか?

つまりActionvoid戻り値の型を持つパラメーターなしのC#と同等ですか?

回答:


95

私が正しく理解していれば、メソッドとの機能的なインターフェースが必要ですvoid m()。その場合は、単にを使用できますRunnable


29
Runnableのインターフェース仕様は、Threadクラスに実行可能コードを提供することを示しています。Runnableスレッドでの実行を目的としていない場所で使用するのは適切ではないようです。誤解を招くようです。関数インターフェイスの仕様を満たし、ラムダ構文を使用して作成できるため、はRunnableとして定義されてFunctionalInterfaceいます。独自の機能的なインターフェースを作成してみませんか?見たRunnableを参照してくださいFunctionalInterfaceを
TheSecretSquad

6
@TheSecretSquad(i)にRunnableは注釈が付けられ@FunctionalInterface、(ii)ラムダ式のコンテキストでもスレッドで実行されます:現在のスレッドである可能性があるラムダが実行されるスレッド...
assylias

9
私は@TheSecretSquadに同意しますが、機能要件は満たしますが、意味的に聞こえません。Runnableは一般的にスレッドの作成に関連付けられています。doWorkメソッドを使用した単純なWorker機能インターフェースは良かったでしょう。編集:おっと:stackoverflow.com/questions/27973294/...
jpangamarca

6
上記の@jpangamarcaの「おっと」を具体化する:彼がリンクした重複した質問のコメントで、ブライアンゲッツRunnableは、スレッドのコンテキストだけでなく、この目的で使用することを意図していたことを確認しました。
Joshua Goldberg

10
ただし、その場合は、javadocをより汎用的にする必要があると思います。docs.oracle.com
Joshua Goldberg

15

自分で作る

@FunctionalInterface
public interface Procedure {
    void run();

    default Procedure andThen(Procedure after){
        return () -> {
            this.run();
            after.run();
        };
    }

    default Procedure compose(Procedure before){
        return () -> {
            before.run();
            this.run();
        };
    }
}

このように使用します

public static void main(String[] args){
    Procedure procedure1 = () -> System.out.print("Hello");
    Procedure procedure2 = () -> System.out.print("World");

    procedure1.andThen(procedure2).run();
    System.out.println();
    procedure1.compose(procedure2).run();

}

そして出力

HelloWorld
WorldHello

質問の精神を考えると、これは受け入れられる答えであるべきだと私は本当に感じています。
corsiKa

0

@FunctionalInterfaceはメソッドの抽象メソッドのみを許可するため、以下のようにラムダ式を使用してそのインターフェースをインスタンス化でき、インターフェースメンバーにアクセスできます

        @FunctionalInterface
        interface Hai {

            void m2();

            static void m1() {
                System.out.println("i m1 method:::");
            }

            default void log(String str) {
                System.out.println("i am log method:::" + str);
            }

        }

    public class Hello {
        public static void main(String[] args) {

            Hai hai = () -> {};
            hai.log("lets do it.");
            Hai.m1();

        }
    }


output:
i am log method:::lets do it.
i m1 method:::
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.