あまり荒らしすぎないでください。記事の翻訳を始めたばかりです
インターフェイスは別のインターフェイスから継承できます。インターフェイスが関数型インターフェイスから継承し、新しい抽象メソッドが含まれていない場合、このインターフェイスも関数型です。ただし、インターフェイスに含めることができるのは 1 つの抽象メソッドと多数のデフォルト メソッドのみであり、引き続き機能すると見なされます。
関数型インターフェイスの概要 - Java 8 で再現された概念
世界中のすべての Java 開発者は、次のインターフェイスのいずれかを少なくとも 1 回は使用したことがあります:java.lang.Runnable
、java.awt.event.ActionListener
、java.util.Comparator
、java.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 は図のようにそれをエラーとしてマークします。
他に読むべきもの: |
---|
@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 ビルド) – 匿名内部クラスを使用するときにヒントが得られます。 これは、Java 8 の関数型インターフェイスの概念とその実装方法についての簡単な紹介でした。ラムダ式を使用します。
GO TO FULL VERSION