出典: DZone ここでは、Java の関数インターフェイスの概要、目的、例、ラムダ式、事前定義インターフェイスのリストを示します。 オブジェクト指向プログラミング言語である Java は、言語内の一部のプリミティブ データ型とメソッドを除くすべてがクラスとオブジェクトを中心に展開されていたため、以前は独立した関数を持つことができませんでした。ただし、Java 8 では、Functional Interface と呼ばれる新しい概念が導入され、Lambda Expressions、Time API、Stream API などの他の機能も導入されました。これらの機能インターフェイスとは何ですか?また、それらを定義する方法は何ですか? 確認してみましょう!
インターフェースとは何ですか?
インターフェイスは、システム要素の相互作用を決定する一連のルールです。これは、抽象メソッドと静的定数を含むクラスのアウトラインとしても知られています。インターフェイスには 1 つ以上の抽象メソッドが含まれる場合があります。インターフェイスを使用すると、クラスの要件、つまりクラスにどのメソッドが必要かを設定することもできます。簡単に言うと、インターフェイスは、すべての実装クラスが遵守する必要がある契約のようなものです。以下に例を示します。Interface A1
{
void method1();
String method2(String X);
}
Class A1 implements A
{
@Override
public void method1(){}
@Override
public String method2(String X) { return x; }
}
インターフェイスを実装するクラスがインターフェイスのメソッドをすべて宣言していない場合、コードは実行されず、次のエラーが生成されます。「エラー: A1 は抽象ではなく、A1 の抽象メソッドをオーバーライドしません。」" (エラー: A1 は抽象ではなく、A1 の抽象メソッドをオーバーライドしません)。JDK 8 より前は、インターフェイスで実装を定義できませんでしたが、現在はインターフェイス メソッドにデフォルトの実装を追加できます。また、静的メソッドとデフォルト メソッドを定義することもできます。インターフェイス内のオブジェクトなしで呼び出すことができます インターフェイスは主に、コード内で多重継承と疎結合を実現するために使用されます。インターフェイスについて明確に理解できたので、関数型インターフェイスとは何か、またそれがどのように機能するかを見てみましょう。
関数型インターフェースとは何ですか?
関数型インターフェイスは、Single Abstract Method (SAM) インターフェイスとしても知られています。名前が示すように、抽象メソッドを最大 1 つだけ持つことができます。関数型インターフェイスには、実装を伴ういくつかの静的メソッドとデフォルト メソッドのほか、追加の抽象メソッドを含めることができます。インターフェースを機能的としてマークするには、@FunctionalInterfaceアノテーションが使用されます。これは、追加メソッドの誤った宣言を避けるために必要です。関数型インターフェイスの人気の理由は、匿名で面倒なクラス実装を使用せずに、ラムダ式を使用してインターフェイスを作成できることです。インターフェイス内で定義されたメソッドはデフォルトで抽象であるため、関数インターフェイスでの abstractキーワードの使用はオプションです。ラムダ式とは何ですか?
ラムダ式は、それ自体では実行されない名前のないメソッドまたは匿名のメソッドですが、関数インターフェイスの特定のメソッドを実装するために使用されます。次のように定義されます。(parameter list) -> lambda body
コード内で使用される矢印演算子 ( -> ) は、ラムダ演算子として知られています。たとえば、次のメソッドがあるとします。
double getGoldenRatioValue() {
return 1.61803;
}
ラムダ式を使用すると、次のように記述できます。
() -> 1.61803
ご覧のとおり、ラムダ関数のメソッドにはパラメーターがないため、ステートメントの左側は空です。右側がアクションを決定するため、この例では黄金比の値 1.61803 が返されます。Java 8 より前は、インターフェイスの実装または内部クラス オブジェクトの作成が重要でしたが、Java 8 では、関数インターフェイスにラムダ式を割り当てるだけで済みます。
機能インターフェイスの例
関数インターフェースを作成するには、 @FunctionalInterfaceアノテーションを使用するか、Java の事前定義された関数インターフェースを使用します。例1
- まず、@FunctionalInterfaceをタグ付けし、抽象getGoldenRationValue()メソッドによって呼び出されるMyInterfaceというインターフェイスを作成します。
- 次に、メソッドを実行するパブリック クラスmainを作成します。
- 関数型インターフェイスでラムダ式を使用するには、 MyInterfaceDemoへの参照を宣言し、ラムダ式をその参照に割り当てます。
- 最後に、リファレンス インターフェイスを使用して黄金比の値を出力します。
import java.lang.FunctionalInterface;
// Creation и маркировка функционального интерфейса
@FunctionalInterface
interface MyInterface {
// Это абстрактный метод
double getGoldenRatioValue();
}
public class Main {
public static void main( String[] args ) {
//декларируем ссылку на функциональный интерфейс
MyInterface ref;
//используем Lambda Expression
ref = () -> 1.61803;
System.out.println("Value of Golden Ratio = " + ref.getGoldenRatioValue());
}
}
結論:
黄金比の値 = 1.61803
例 2
- この例では、定義済み関数インターフェイスToDoubleFunction を使用します。これはT引数を受け取り、出力としてdoubleを返します。
- ToDoubleFuntion には、 applyasDouble()という抽象メソッドが含まれています。
- 最後に、スペースを含むメッセージ全体の長さを出力します。
import java.util.function.ToDoubleFunction;
public class MyInterface2 {
public static void main(String[] args) {
ToDoubleFunction<String> length = x -> x.length();
System.out.println(length.applyAsDouble("This is an example of predefined functional interface."));
}
}
結論:
54.0
プリインストールされた機能インターフェイスのリスト
関数インターフェイスを定義する方法がわかったので、事前定義された (組み込みの) 関数インターフェイスがいくつあるか見てみましょう。さまざまな状況で実装できる関数インターフェイスには、Consumer、Predicate、Function、Supplierの 4 つの主なタイプがあります。これら 4 つのインターフェイスのうち、Consumer、Function、およびPredicateには追加の関数インターフェイスがあります。以下は、Java のすべての組み込みインターフェースまたは事前定義されたインターフェースのリストです。 注記。以下の表に記載されている T、U、R は、それぞれ第一引数 (T)、第二引数 (U)、演算結果 (R) の型を表します。インターフェース | タイプ |
---|---|
実行可能 | → |
バイコンシューマー(T、U) | て、う→ |
BiFunction(T、U、R) | て、う→R |
二項演算子 | T、T <→ R |
BiPredicate<T, U> | T、U → ブール値 |
ブール値サプライヤー | → ブール値 |
消費者 | た→ |
ダブルバイナリ演算子 | ダブル、ダブル→ダブル |
ダブルコンシューマー | ダブル → |
ダブルファンクション | ダブル→R |
二重述語 | 倍精度 → ブール値 |
ダブルサプライヤー | ブール値 → |
DoubleToIntFunction | 倍精度 → 整数 |
DoubleToLongFunction | ダブル→ロング |
DoubleUnaryOperator | ダブル→ダブル |
関数<T,R> | T → R |
IntBinaryOperator | 整数 → 整数 |
IntConsumer | 整数→ |
整数関数 | 整数 → R |
IntPredicate | 整数 → ブール値 |
イントサプライヤー | → 整数 |
IntToDoubleFunction | int → double |
IntToLong関数 | int→long |
IntUnaryOperator | 整数 → 整数 |
LongBinary演算子 | 長い、長い → 長い |
ロングコンシューマー | 長い→ |
LongFunction | ロング→R |
長い述語 | 長い→ |
ロングサプライヤー | →長い |
LongToDoubleFunction | ロング→ダブル |
LongToIntFunction | 長整数 → 整数 |
Long単項演算子 | 長い→長い |
ObjDoubleConsumer | T、ダブル → |
ObjIntConsumer | T、整数 → |
ObjLongConsumer | た、ロング→ |
述語 | T → ブール値 |
サプライヤー | → た |
ToDoubleBiFunction<T, U> | T、U→ダブル |
ToDoubleFunction | T→ダブル |
ToIntBiFunction<T, U> | T、U → int |
ToIntFunction | T → 整数 |
ToLongBiFunction<T, U> | T、U→ロング |
ToLongFunction | T→ロング |
単項演算子 | た→た |
要約しましょう
この投稿から覚えておくべき重要なポイントは次のとおりです。- インターフェイスは抽象化メカニズムとして機能します。
- 関数型インターフェイスには、実装を伴ういくつかの静的メソッドとデフォルト メソッドのほか、追加の抽象メソッドを含めることができます。
- 関数型インターフェイス内で定義されたメソッドはデフォルトで抽象であるため、 abstractキーワードを使用する必要はなくなりました。
- ラムダ式は、それ自体では実行されない匿名メソッドですが、関数インターフェイスの特定のメソッドを実装するために使用されます。
- 関数インターフェースを作成するには、 @FunctionalInterfaceアノテーションを使用するか、Java の事前定義された関数インターフェースを使用します。
GO TO FULL VERSION