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