機能的インターフェイスは、抽象的なメソッドが1つしかないが、複数の非抽出方法を持つことができるインターフェイスです。
機能的なインターフェイスは、暗黙的にラムダ式に変換できます。
機能的なインターフェイスは、既存の機能によりラムダに優しいものをサポートできます。
導入
関数インターフェイスは、実際には抽象インターフェイスクラスです。次の機能的なインターフェイスは、Java 8の前に見つかりました。
java.lang.runnablejava.util.concurrent.callablejava.util.comparator
等...
使い方
実際、上記のインターフェイスクラスは、functionalinterfaceアノテーションで変更する必要があり、Javaの機能的インターフェイスになる必要があります。たとえば、JDKの呼び出し可能なインターフェイス定義
@functionalinterfacepublicインターフェイスコール可能<v> {v call()スロー例外;}そんなに簡単です。
次に、Java 8に追加された新しい関数インターフェイスについて話しましょう。これがその定義です
// tは着信パラメーター// rはreturnパラメーター@functionalinterfacepublicインターフェイス関数<t、r> {r apply(t t);デフォルト<v> function <v、r> compose(function <?super v、?extens t> extens t> figd exting {objects.requirenonnull(vefore); return(v v) - > apply(before.apply(v));} default <v> function <t、v> and(function <?super r、?at extend v> after(after); } static <t> function <t、t> decture(){return t-> t;それは、C言語の関数ポインターとして理解できます(個人的な意見)。
実際には、適用方法が広く使用されています。 Compose/およびThenは、主に3つ以上の関数インターフェイスと実行シーケンスが実行されるシナリオで使用されます。
特定のビジネスコードでは、通常、bifuncton/サプライヤーと組み合わせて使用します。 Bifunctionは2つのパラメーターをサポートし、関数は1つのパラメーターのみをサポートします。サプライヤーを使用して、特定の必要な値を保存し、GETを取得できます。
例
通常作業するコードへの参照。この例では、主に、コードが肥大化される場合の複数の判断条件を回避します。同時に、同じビジネスロジックを関数インターフェイスから抽出できるため、コードを複数の場所で再利用できます。特定のコードは次のとおりです。
function <object、actiontest1 =(object) - > {// logic return 0;}; function <object、integer> actiontest2 =(object) - > {// logic return 0;}; public supply <map <integer、function object <object、integer >>> actionsupplier =() - > {map <integer <integer < hashmap <>(); maps.put(1、actiontest1); maps.put(2、ActionTest2); return Maps;}; // public void test(int type、object object){optional.ofnullable(ActionSupplier.get()。get(type))。 // if/else logic if(type == 1){// test1 logic} else if(type == 2){// test2 logic}}}要約します
個人的には、ビジネスロジック分野でより多くの判断があるシナリオでは、機能を使用する方が適しており、次の利点があると思います。
機能的なインターフェイスの例
Predicate <T>インターフェイスは、入力パラメーターTを受け入れ、ブール結果を返す機能的なインターフェイスです。
このインターフェイスには、述語を他の複雑なロジックに組み合わせるためのさまざまなデフォルトメソッドが含まれています(vers、または非非など)。
このインターフェイスは、オブジェクトがtrueまたはfalseのテストに使用されます。
次の例(java8tester.java)を使用して、機能的インターフェイスの述語<t>の使用を理解できます。
java8tester.javaファイルインポートjava.util.arrays;インポートjava.util.list; import java.util.function.function.predicate; public class java8tester {public static void main(string args []){list <integer> list = arrays.aslist(1、2、3、4、5、6、7、8、9); // Predicate <Integer> Predicate = n - > true // nは、引数をPredicateインターフェイスに渡すテスト方法です// nがある場合、テストメソッドはtrue system.out.println( "out all data:")を返します。 //パラメーターn eval(list、n-> true)を渡します。 // Predicate <Integer> predict1 = n - > n%2 == 0 // nは、パラメーターをPredicateインターフェイスに渡すテスト方法です// n%2が0の場合、test methodはtrue system.out.println( "out all vitunt numbers:")を返します。 eval(list、n-> n%2 == 0); // Predicate <Integer> predict2 = n - > n> 3 // nは、パラメーターをPredicateインターフェイスに渡すテスト方法です// nが3を超える場合、testメソッドはtrue system.out.println( "すべての数字が3を超える出力を出力します:"); eval(list、n-> n> 3); } public static void eval(list <integer> list、predicate <integer> predict){for(integer n:list){if(predicate.test(n)){system.out.println(n + ""); }}}}上記のスクリプトを実行すると、出力の結果は次のとおりです。
$ javac java8tester.java
$ java java8tester
すべてのデータを出力します:
1
2
3
4
5
6
7
8
9
すべての偶数を出力します:
2
4
6
8
3を超えるすべての数値を出力します:
4
5
6
7
8
9
要約します
上記は、Java 8関数の関数インターフェイスと、エディターによって導入された機能インターフェイスの例です。私はそれが誰にでも役立つことを願っています。ご質問がある場合は、メッセージを残してください。編集者は、すべての人に時間内に返信します。 wulin.comのウェブサイトへのご支援ありがとうございます!