JAVA8ラムダ関数

1ラムダ関数の概念

  単に無名関数として理解:

   公共int型の追加(int型のx、int型Y){
        リターンX + Y。
    }

 ラムダ関数にオン:(int型のx、int型のY) - > X + Y。  

 又は(X、Y) - > X + Y、コンパイラが自動的にパラメータの種類を認識

 

2ラムダを入力

「ターゲット・タイプ(ターゲット・タイプ)」と呼ばれるラムダ式を入力します。ラムダ式はJava8が導入されたターゲット・タイプ「機能インターフェース(機能的インターフェイス)」です。

明示的に宣言した場合のインタフェースは、抽象メソッドは、それは関数インタフェースです。

通常@FunctionalInterfaceで出印(または標識されない場合があり、すべての後、唯一の関数/メソッド)

なぜそれだけのインターフェース機能を定義することができます。私たちのラムダ関数は、法の一般的なタイプであるため、コンパイラが自動的にその方法を識別します。

 

例:

//これは、スレッド・インタフェースであります

@FunctionalInterface
    パブリックインターフェイスのRunnable {ボイドランを(); }

また、複数のインタフェースを宣言することができますが、デフォルトのオブジェクトのインタフェースが継承する必要があります(継承オブジェクトのインタフェースすべてのクラスに等しい)、インターフェースがより一つの機能よりもラムダ宣言に表示することができます。

如下:
    パブリックインターフェイスコンパレータ<T> {INT比較(T O1、T O2)。ブール等しい(オブジェクトOBJ)。}

 

インターフェイスタイプによれば、コンパイラが自動的にマッチング法。ラムダカスタムインタフェースなどを含みます

@FunctionalInterface
    パブリックインターフェイスMyRunnable {
        公共ボイドラン();
    }

正しい言葉遣いの下では、自動的に対応するインターフェース機能と一致

  実行可能R1 =() - > {するSystem.out.println( "こんにちはラムダ!");};
    MyRunnable2 R2 =() - > {するSystem.out.println( "こんにちはラムダ!");};

λ式があれば機能を正常に一致させることができるように、複数のターゲットタイプ(機能インターフェース)を有することができることをこれは示しています。

 

3ラムダ式の使用

3.1内部の匿名クラス、等インシデントレスポンス、通過実行可能スレッドクラスとしてコールバックのすべての種類、

オールドスクールスレッド=新しいスレッド(新しいRunnableを(){
        @Override
        ます。public void実行(){
            System.out.printlnは( "これは匿名クラスからです。");
        }
    });
   
    スレッドgaoDuanDaQiShangDangCi =新しいスレッド(() - > {
        のSystem.out.println() "これは、匿名メソッド(ラムダ式)からのものです。";
    });

第二は、ラムダ式である、コンパイラが自動的に推論されます:スレッドコンストラクタがRunnableを引数を受け入れ、入ってくるλ式はRunnableをに推測その実行()関数で、そのJavaコンパイラに適合します

 

3.2  コレクションバッチ操作

3.2.1)リスト

バッチ操作APIコレクションクラスは、(ユーザが自分の式ループ反復について以前書いた)「内部反復」コレクションクラスを達成することである、と現代のマルチコアCPUの並列計算の完全な利点を望ま。

(オブジェクトo:リスト)のために{ // 外部反復
        するSystem.out.println(O);
    }

以下のように書くことができます。

    list.forEach(O - > {のSystem.out.println(O);});内部用// forEachの反復関数

3.2.2)ストリーム

 一覧<形状>形状= ...
    shapes.stream()
      .filter(S - > s.getColor()== BLUE)
      .forEach(S - > s.setColor(RED));

述語フィルタメソッドのパラメータの型、パラメータの型消費者のforeach方法であり、これらはインターフェースの関数であり、式λを使用することが可能です

名前が、ストリームを示唆しているように、現代のマルチコアCPUの特性を最大限に活用するために、並列処理を示しているという点でparallelStream(呼び出されたメソッドは、)(、)もあります。

以下は、典型的な大規模なデータ処理方法で、フィルター-地図-削減します:

    String型の//指定された配列、ここで、全ての異なる素数同定する
    公共ボイドdistinctPrimary(文字列...数値){
        リストの<string> L =は、Arrays.asList(番号);
        リスト<整数> = R&LT L.ストリーム()
                .MAP(E - >新しい新しい整数(E))
                .filter(E - > Primes.isPrime(E))
                .distinct()
                .collect(Collectors.toList());
        System.out.printlnは(「distinctPrimary結果である:「+ R&LT);
    }

あなたはこのような場合には、リストLが何度も繰り返されると思い、マップ、フィルタ、個別の両方の1サイクルあるかもしれませんが、効率が悪くなります。それはそうではありません。別のストリーム・メソッドは「遅延(遅延)」で戻り、そして最後には最終結果収集方法が戻るために、「不安(熱心)」です。熱心な方法を満たす前に、方法は怠惰行いません。

3.2.3)オプションの使用

問題のjava悪名高いヌルポインターを解決するために、それ自体のオプションが、ラムダ式で、我々はいくつかの非常に強力な機能を作りました。

1)マップ

パブリック<U>オプション<U>マップ(<?スーパーT、延びU>関数マッパー){ 
    Objects.requireNonNull(マッピング)。
    場合(!isPresentは()) 
        )(空を返します。
    他{ 
        リターンOptional.ofNullable(mapper.apply(値))。
    } 
}

パラメータは、関数のラムダ目的関数値オプションの空を定義して、空を返します。

NULLの場合は、パラメータTのラムダ値は、実際のパラメータRに基づいて返された戻り値は、目的関数としてではありません

以下の方法Opationalコールに参加:

マップ(StreamExecutionEnvironmentFactory :: createExecutionEnvironment)

実際の値は空です。空のサイトは、ラムダ式参照の方法StreamExecutionEnvironmentFactory.createExecutionEnvironment(値)と呼ばれています

4参照方法

任意のλ式は、ユニークな方法で記述無名関数インタフェースを表すことができます。また、参照法と呼ばれる、記述子を表現するために、クラスの特定のメソッドを使用することができます

/ C1、C2は同じ(静的メソッド参照)である
    コンパレータ<整数> C2 =(X、Y) - > Integer.compare(X、Y);
    コンパレータ<整数> = C1 ::整数を比較します。

 //以下の2つが同じである(参考例方法1)
    persons.forEach(E - >のSystem.out.println(E));
    persons.forEach(のSystem.out ::のprintln)。

//以下の2つが同じである(参考例方法2)
    persons.forEach(人物- > person.eat());
    persons.forEach(Personが:: EAT)。

 //以下の2つが同じ(参考コンストラクタ)です
    strList.stream()地図(S - >新しい新しい整数(S));.
    StrList.stream()地図(::新しい新しい整数)。

 

参照文献:https://blog.csdn.net/ioriogami/article/details/12782141

公開された16元の記事 ウォンの賞賛0 ビュー2816

おすすめ

転載: blog.csdn.net/peidezhi/article/details/104049777