Java 関数インターフェイス

Java の関数型インターフェイスは、抽象メソッドを 1 つだけ含むインターフェイスです。関数型インターフェイスには複数のデフォルト メソッドまたは静的メソッドを含めることができますが、抽象メソッドは 1 つだけです。

Java 8 以降では、ラムダ式とメソッド参照を使用して関数インターフェイスのインスタンスを表すことができます。

例: ラムダ式での関数型インターフェイスの使用

Java
   public     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 注釈」メッセージにフラグを立てます。ただし、このアノテーションの使用は必須ではありません。

注記:

@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 プログラム

Java
   class   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. 消費者
  2. 述語
  3. 関数 
  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!';

例: 述語インターフェースを使用した文字列のフィルタリング

Java
   import     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 ラムダ式