JavaRush /Java Blog /Random-JA /関数インターフェースの概要
minuteman
レベル 32

関数インターフェースの概要

Random-JA グループに公開済み
あまり荒らしすぎないでください。記事の翻訳を始めたばかりです 関数インターフェイスの概要 - 1

関数型インターフェイスの概要 - Java 8 で再現された概念

世界中のすべての Java 開発者は、次のインターフェイスのいずれかを少なくとも 1 回は使用したことがあります: java.lang.Runnablejava.awt.event.ActionListenerjava.util.Comparatorjava.util.concurrent.Callable。それらすべてに共通点が 1 つあります。それは、すべてのメソッドが 1 つだけであるということです。JDK にはこのようなインターフェイスが他にもたくさんあり、Java 開発者によって作成されたインターフェイスもあります。これらのインターフェイスは (SAM インターフェイス) とも呼ばれますSingle Abstract Method interfaces。これらのインターフェイスを使用する最も一般的な方法の 1 つは、次の例のように、これらのインターフェイスを使用する匿名内部クラスを作成することです。
public class AnonymousInnerClassTest {
    public static void main(String[] args) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("A thread created and running...");
            }
        }).start();
    }
}
Java 8 では、SAM の概念が再作成され、機能インターフェイスと呼ばれます。これらは、ラムダ式、メソッド参照、および参照コンストラクターを使用して表現できます。新しい @FunctionalInterface アノテーションが作成されました。これは、アノテーションを付けたインターフェイスが機能レベルで動作しない場合に、コンパイラ レベルでエラーをスローするために使用されます。1 つの抽象メソッドを含む単純な関数インターフェイスを見てみましょう。
@FunctionalInterface
public interface SimpleFunInterface {
    public void doWork();
}
インターフェイスはクラスから抽象メソッドを宣言することもできますjava.lang.Objectが、この場合、インターフェイスは関数型として宣言することもできます。
@FunctionalInterface
public interface SimpleFuncInterface {
    public void doWork();
    public String toString();
    public Boolean equals(Object o);
}
インターフェイスに別の抽象メソッドを追加するとすぐに、IDE は図のようにそれをエラーとしてマークします。 関数インターフェイスの概要 - 2 インターフェイスは別のインターフェイスから継承できます。インターフェイスが関数型インターフェイスから継承し、新しい抽象メソッドが含まれていない場合、このインターフェイスも関数型です。ただし、インターフェイスに含めることができるのは 1 つの抽象メソッドと多数のデフォルト メソッドのみであり、引き続き機能すると見なされます。
@FunctionalInterface
public interface ComplexFunctionalInterface extends SimpleFuncInterface {
    default public void doSomeWork() {
        System.out.println("Doing some work in interface impl...");
    }
    default public void doSomeWork() {
        System.out.println("Doing some other work in interface impl...");
    }
}
一番上の例はまだ機能的なインターフェイスです。次に、ラムダ式を使用して匿名内部クラスを置き換えて関数型インターフェイスを実装する方法を見てみましょう。
/*
*Implementation the interface by creating an
*anonymoous inner class versus using
*lambda expression.
*/
public class SimpleFunInterfaceTest {
    public static void main(String[] args) {
        carryOutWork(new SimpleFunInterface() {
            @Override
            public void doWork() {
                System.out.println("Do work in SimpleFun impl...");
            }
        });
        carryOutWork(() -> System.out.println("Do work in lambda exp impl..."));
    }
    public static void carryOutWork(SimpleFuncInterface sfi) {
        sfi.work();
    }
}
プログラムの結果は次のようになります。
Do work in SimpleFun impl...
Do work in lambda exp impl...
Java ラムダ式構文をサポートする IDE を使用している場合 (Netbeans 8 Nightly ビルド) – 匿名内部クラスを使用するときにヒントが得られます。 関数インターフェイスの概要 - 3 これは、Java 8 の関数型インターフェイスの概念とその実装方法についての簡単な紹介でした。ラムダ式を使用します。
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION