Java の関数型インターフェイスは、抽象メソッドを 1 つだけ含むインターフェイスです。関数型インターフェイスには複数のデフォルト メソッドまたは静的メソッドを含めることができますが、抽象メソッドは 1 つだけです。
Java 8 以降では、ラムダ式とメソッド参照を使用して関数インターフェイスのインスタンスを表すことができます。
例: ラムダ式での関数型インターフェイスの使用
Javapublic class Geeks { public static void main(String[] args) { // Using lambda expression to implement Runnable new Thread(() -> System.out.println('New thread created')).start(); } }
出力
New thread created
説明:
- 上記のプログラムは、Runnable 関数インターフェイスでのラムダ式の使用を示しています。
- Runnable には抽象メソッド run() が 1 つあるため、関数型インターフェイスとして適格です。
- Lambda ()-> System.out.println('新しいスレッドが作成されました') は run() メソッドを定義します。
- new Thread().start() はラムダ本体を実行する新しいスレッドを開始します
注記:
あ f 機能インターフェイスは、別の機能インターフェイスを拡張することもできます。
@FunctionalInterface 注釈
@FunctionalInterface アノテーションは、関数インターフェースが複数の抽象メソッドを持つことができないようにするために使用されます。複数の抽象メソッドが存在する場合、コンパイラは「予期しない @FunctionalInterface 注釈」メッセージにフラグを立てます。ただし、このアノテーションの使用は必須ではありません。
注記:
git でチェックアウトする
@FunctionalInterface アノテーションはオプションですが、使用することをお勧めします。インターフェイスに抽象メソッドが 1 つだけあることを確認することで、初期段階でエラーを検出するのに役立ちます。
例: @FunctionalInterface アノテーションを使用した関数インターフェースの定義
Java@FunctionalInterface interface Square { int calculate(int x); } class Geeks { public static void main(String args[]) { int a = 5; // lambda expression to define the calculate method Square s = (int x) -> x * x; // parameter passed and return type must be same as defined in the prototype int ans = s.calculate(a); System.out.println(ans); } }
出力
25
説明 :
- Square は、単一のメソッド Calculate(int x) を備えた関数インターフェイスです。
- ラムダ式 (int x) -> x * x は、calculate メソッドの実装に使用されます。
- Lambda は x を入力として受け取り、x * x を返します。
Java 8 より前の Java 関数インターフェイス
Java 8 より前は、匿名の内部クラス オブジェクトを作成するか、これらのインターフェイスを実装する必要がありました。以下は、ラムダ式の導入前に Runnable インターフェイスがどのように実装されたかを示す例です。
例: 関数インターフェースをデモンストレーションするための Java プログラム
Javaclass Geeks { public static void main(String args[]) { // create anonymous inner class object new Thread(new Runnable() { @Override public void run() { System.out.println('New thread created'); } }).start(); } }
出力
New thread created
組み込みの Java 関数インターフェイス
Java SE 1.8 以降、関数型インターフェースに変換されたインターフェースが多数あります。これらすべてのインターフェイスには @FunctionalInterface の注釈が付けられます。これらのインターフェイスは次のとおりです。
- 実行可能: このインターフェイスには、 走る() 方法。
- 比較可能なもの: このインターフェイスには、compareTo() メソッドのみが含まれています。
- アクションリスナー: このインターフェイスには、actionPerformed() メソッドのみが含まれています。
- 呼び出し可能: このインターフェイスには call() メソッドのみが含まれています。
Java の関数インターフェイスの種類
Java SE 8 には、以下に示すように、さまざまな状況に適用できる 4 つの主要な種類の関数インターフェースが含まれています。
- 消費者
- 述語
- 関数
- サプライヤー
1. 消費者
の 消費者向けインターフェース 関数インターフェイスのは、引数を 1 つだけ受け入れるか、ジェントリファイドされた引数を受け入れるインターフェイスです。コンシューマ インターフェイスには戻り値がありません。何も返しません。 Consumer の機能的なバリエーションもあります。 ダブルコンシューマー IntConsumer そして ロングコンシューマー 。これらのバリアントは、引数としてプリミティブ値を受け入れます。
これらのバリアントの他に、Consumer インターフェイスにはもう 1 つバリアントとして知られるバリアントがあります。 バイコンシューマー 。
構文:
消費者
Consumer = (値) -> System.out.println(値);
Java Consumer 関数インターフェイスのこの実装は、print ステートメントにパラメータとして渡された値を出力します。この実装ではJavaのLambda関数を使用します。
2. 述語
の 述語インターフェース 1 つの引数のブール値関数を表します。これは、ストリームでのフィルタリング操作によく使用されます。 Consumer 関数インターフェイスと同様に、Predicate 関数インターフェイスにもいくつかの拡張機能があります。これらは IntPredicate 二重述語 そして 長い述語 。これらのタイプの述語関数インターフェイスは、プリミティブ データ型または値のみを引数として受け入れます。
構文:
パブリックインターフェース述語
{
ブール値テスト(T t);
}
Java 述語関数インターフェイスは、Lambda 式を使用して実装することもできます。
述語
述語 = (値) -> 値 != null;
3. 機能
あ 関数 Java の関数インターフェイスの一種で、引数を 1 つだけ受け取り、必要な処理の後に値を返します。関数インターフェイスの多くの異なるバージョンが実用的であり、double int long などのプリミティブ型でよく使用されます。
構文:
関数
関数 = (値) -> 値 * 値;
- 二機能: の 二機能 実質的に関数に関連しています。さらに、Function は 2 つの引数を受け取りますが、Function は 1 つの引数を受け取ります。
- 単項演算子と二項演算子: 他にも次の 2 つの機能インターフェイスがあります。 単項演算子 そして 二項演算子。 これらは両方とも、入力型と出力型が同じである Function と Bi-Function をそれぞれ拡張します。
4. サプライヤー
の サプライヤー 関数型インターフェイスも、入力や引数を受け取らず、単一の出力を返す関数型インターフェイスの一種です。サプライヤー機能インターフェイスのさまざまな拡張機能には、次のような他の多くのサプライヤー機能が保持されます。 ブール値サプライヤー ダブルサプライヤー ロングサプライヤー そして イントサプライヤー 。これらすべてのさらなる特殊化の戻り値の型は、対応するプリミティブのみです。
構文:
サプライヤー
サプライヤー = () -> 'Hello World!';
例: 述語インターフェースを使用した文字列のフィルタリング
Javaimport java.util.*; import java.util.function.Predicate; class Geeks { public static void main(String args[]) { // create a list of strings List<String> n = Arrays.asList('Geek' 'GeeksQuiz' 'g1' 'QA' 'Geek2'); // declare the predicate type as string and use lambda expression to create object Predicate<String> p = (s) -> s.startsWith('G'); // Iterate through the list for (String st : n) { // call the test method if (p.test(st)) System.out.println(st); } } }
出力
Geek GeeksQuiz Geek2
機能インターフェイスの表
機能インターフェイス | 説明 | 方法 |
---|---|---|
実行可能 | スレッドによって実行できるタスクを表します。 | ボイドラン() |
匹敵する | 2 つのオブジェクトを比較して順序付けします。 | int CompareTo(T o) |
アクションリスナー | イベント駆動型プログラミングでアクション イベントを処理します。 | void actionPerformed(ActionEvent e) |
呼び出し可能 | これは、結果を返すか例外をスローできるタスクを表します。 | V call() が例外をスローする |
消費者 | 単一の入力引数を受け取り、結果は返しません。 | void accept(T t) |
述語 | 単一の引数を受け入れ、ブール値の結果を返します。 | ブール値テスト(T t) |
関数 | 単一の引数を受け取り、結果を返します。 | R適用(Tt) |
サプライヤー | 引数は取りませんが、結果を提供します。 | T get() |
バイコンシューマー | 2 つの引数を受け取り、結果は返しません。 | void accept(T t U u) |
二重述語 | 2 つの引数を受け取り、ブール値の結果を返します。 | ブール値テスト(T t U u) |
バイファンクション | 2 つの引数を受け取り、結果を返します。 「メイソンの公式」 | R適用(T t U u) |
単項演算子 | これは、入力と出力の型が同じである Function の特殊なケースです。 | T 適用(T t) |
二項演算子 | これは、入力と出力の型が同じである BiFunction の特殊なケースです。 | T 適用(T t1 T t2) |
関連記事
- Java 8
- Java ラムダ式