この記事は学習の参考のみを目的としています。
関連チュートリアルのアドレス:
https://www.runoob.com/java/java8-function-interfaces.html
https://www.cnblogs.com/dgwblog/p/11739500.html
https://www.developer.com/java/java-function-interfaces/
インターフェイスは、一連のメソッドとそのシグネチャを定義するコントラクトです。どのクラスでもこのインターフェイスを拡張し、このインターフェイスのメソッドを実装できます。Java プログラミング言語は、言語の初期バージョンからインターフェイスのサポートを提供してきました。
関数型インターフェイスは Java の人気のある機能で、バージョン 8 で Java 言語に追加されました。これらにより、開発者は関数をファーストクラスのオブジェクトとして作成できるため、再利用可能なコードを作成し、開発プロセスを簡素化する新たな可能性が開かれます。
この記事では、関数型インターフェイス、その仕組み、便利な理由、および開発者がプロジェクトで関数型インターフェイスを使用する方法の例を紹介します。
Java の関数型インターフェイスとは何ですか?
Java の関数型インターフェイスは、1 つの抽象メソッド (つまり、実装されていないメソッド) のみで構成されるインターフェイスです。このメソッドには戻り値の型が必要ですが、パラメーターを受け入れることはできません。また、メソッドはパブリックであり、アクセス可能なクラスまたはインターフェイス内にある必要があります。
抽象メソッドに加えて、Java の関数インターフェイスで次のメソッドを作成できます。
- デフォルトのメソッド
- 静的メソッド
- オブジェクトクラスから継承されたメソッド
Java 関数インターフェイスの簡単なコード例を次に示します。
@FunctionalInterface
public interface MyFunctionalInterface
{
void doSomething();
}
ご覧のとおり、インターフェイスには抽象メソッドが 1 つだけあります。
Java でコンパレータ インターフェイスを作成する方法
関数インターフェイスの一般的な例は、2 つのオブジェクトを比較するために使用されるComparatorインターフェイスです。次の抽象メソッドがあります。
int compare(T obj1, T obj2);
Here's how the Comparer interface is defined in Java:
@FunctionalInterface
public interface Comparator {
int compare(T o1, T o2);
boolean equals(Object obj);
//其他方法...
}
Comparator インターフェイスを使用すると、オブジェクトのリスト ** を自然な順序または定義したカスタム順序で並べ替えることができます。たとえば、プログラマはComparator インターフェイスを使用して、文字列のリストを長さで並べ替えることができます。
List listStrings = Arrays.asList("ABC", "XYZ", "PQR");
listStrings.sort((s1, s2) -> s1.length() - s2.length());
System.out.println(listStrings);
リストの順序を逆にすることもできます。
listStrings.sort((s1, s2) -> s2.length() - s1.length());
System.out.println(listStrings);
Java の @FunctionalInterface アノテーション
Java 8 では、アノテーション **@FunctionalInterface** により、インターフェイスが機能インターフェイスとしてマークされます。インターフェイスに複数の抽象メソッドが含まれている場合、このアノテーションを使用してインターフェイスをマークし、コンパイラ エラーを生成できます。Java の関数インターフェイスはラムダ式でよく使用され、複数のデフォルト メソッドを持つことができます。
注釈 **@FunctionalInterface はオプションであることに注意してください。インターフェイスに抽象メソッドが含まれているが、 @FunctionalInterface アノテーションが付けられていない場合でも、それは依然として関数インターフェイスであり、ラムダ式のターゲット型である可能性があります。このアノテーションにより、コンパイラがエラーにフラグを立てるため、機能インターフェイスを誤って非機能インターフェイスに変更することが防止されます。
Java の関数型インターフェイスの利点は何ですか?
関数型インターフェイスの最も注目すべき利点は、コードをコピー アンド ペーストすることなく複数のクラスが使用できる抽象化を作成できることです。これは、開発者がさまざまなメソッドや動作を使用して複雑な抽象化を作成する必要がある場合に特に便利です。
Java では、関数型インターフェイスを使用すると、プログラマは参照オブジェクトではなくパラメータとして関数を渡すことができるため、記述する必要がある定型コードの量が削減されます。
関数型プログラミングでは、コードの一部をデータと考えることができます。ここでラムダ式が登場します。ラムダ式を使用して、コードを別の関数またはオブジェクトに渡すことができます。
ラムダ式は関数インターフェイスをデータ型として使用することに注意してください。関数型インターフェイスには抽象メソッドが 1 つしかないため、そのメソッドの実装は別のメソッドに引数として渡すことができるコードになります。
匿名内部クラスを使用して関数型インターフェイスを実装する
Java 8 より前では、次のコード サンプルに示すように、プログラマは匿名の内部クラスまたはオブジェクトを使用してこのようなインターフェイスを実装していました。
class Test {
public static void main(String args[])
{
new Thread(new Runnable() {
@Override public void run()
{
System.out.println("Hello World!");
}
}).start();
}
}
Java の組み込み関数インターフェース
ComparatorインターフェイスとRunnableインターフェイスに加えて、Java 8 にはCallable、Predicate、Function、Consumerなど、他にも多くの組み込み関数インターフェイスがあります。これらのインターフェースはjava.util.functionパッケージにあります。
ここでは、Java で最も一般的に使用される組み込みインターフェイスについて簡単に説明します。
- Comparator : Comparator は、特定の基準に基づいて 2 つのオブジェクトを比較するために使用されるインターフェイスです。このインターフェースの実装には、 java.util.Comparatorクラスが使用されます。
- Runnable : Runnableインターフェイスを実装し、実行中のスレッドの抽象化を提供する抽象クラスです。
- Callable : 単一の結果値Tを返すタスクを表し、 **call()** メソッドを呼び出すことでアクセスできます。
- Future : Future は、結果がまだ利用できない可能性がある非同期操作を表しますが、将来のある時点 (すべての保留中のアクティビティが成功または失敗に完了したとき) に最終的に利用可能になります。
- サプライヤー:サプライヤーは、値を返し、入力パラメーターを受け取らない単なる関数です。これらは純粋関数とも呼ばれます。
- Predicate : Predicate関数インターフェイスは、ブール パラメーター タイプTで指定された条件に対してtrueまたはfalseを返す述語を表します。
- Consumer : Consumer関数インターフェイスは、型Tのパラメータを受け入れ、結果を返さない関数を表します。
Java でカスタム関数インターフェイスを実装する方法
関数型インターフェイスは 2 つの方法で作成できます。 **@FunctionalInterface アノテーションを追加することで、既存のインターフェイスを関数型インターフェイスに変換できます。あるいは、プログラマは、抽象メソッドを 1 つだけ含むインターフェイスを持つこともできます。次のコード サンプルは、 Java で関数型インターフェイスを定義して使用する方法の完全な例です。**
@FunctionalInterface
interface Test{
void display(String message);
}
public class TestImplementation implements Test{
public void display(String message){
System.out.println(message);
}
public static void main(String[] args) {
TestImplementation obj = new TestImplementation();
obj.display("Hello World!");
}
}
終わり
Java 8 で導入されたラムダ式は、以前のバージョンに比べて構文上の新たな改善を提供し、アプリケーション内の定型コードを排除するのに役立ちます。関数型インターフェイスは Java の第一級住民であり、その実装はラムダ式と考えることができます。関数型インターフェイスを使用すると、匿名内部クラスの冗長性が軽減されるため、関数型コードの作成が容易になります。
関数型インターフェイスは、コードに柔軟性を加える優れた方法です。関数型インターフェイスを使用すると、コーダーはオブジェクトに必要な機能を正確に指定し、要件を満たすクラスでそのオブジェクトを実装することができます。