Java関数プログラミング:Lambda式の初認識

3751 ワード

一,Lambda式
マルチコアCPUとビッグデータの流行に伴い、マルチコアCPU上で動作するプログラムを書くためにjava.util.concurrentパッケージと多くのサードパーティクラスライブラリを発行し、同時抽象化を試みた.
大規模なデータセットに直面して、javaはまだ効率的な並列操作に欠けて、開発者はjava 8を使って複雑な集合処理アルゴリズムを編纂することができて、コードをマルチコアCPUの上で効率的に運行させて、言語の面で既存のJavaを修正して、Java 8はLambda表現式を導入しました
Lambda式の使用は、複雑さをクラスライブラリに抽象化するプロセスであり、新しいStream API操作オブジェクトと集合クラスを使用することで、簡潔で読みやすい同時コードを簡単に書くことができ、複雑なスレッドセキュリティコードよりもコード性能を向上させることができます.Lambda式は、新しい構文を学ぶだけで開発時間とコストを大幅に削減できます.
オブジェクト向けプログラミングはデータを抽象化し,関数式プログラミングは動作を抽象化する.
二、初認識Lambda式
コマンド・プログラミング-動作とボタン・イベントを関連付けます.
button.addActionListener(new ActionListener()){
	public void actionPerformed(ActionEvent event){
		System.out.println("hello Lambda")
	}
}
            ,
             4        ,        
   ,        ,      

Lambda式の使用-動作とボタンイベントを関連付けます.
button.addActionListener(event -> System.out.println("hello Lambda") )
             
event    ,
->    Lambda       

比較:
                    ,
  Lambda              ,        ,
    javac                ,

    ,        ,        

三、Lambda式の例
1,
Runnable noArgs = () -> System.out.println("hello Lambda");

カッコ()は、パラメータ2がないことを示します.
ActionListener noArg = event -> System.out.println("hello Lambda");

パラメータが1つしかない場合は、パラメータの括弧3を省略することができ、
Runnable multistatement = () -> {
	System.out.println("hello Lambda");
	System.out.println("hello Lambda");
}

Lambda式のトピックはコードブロックで、カッコ{}を使用してコードブロックを囲み、異常が1行しかないLambda式はカッコ{}4を省略できます.
binaryOperator add = (x, y) -> x + y

以上のコードは計算ではなく、加算の結果addを計算するための関数を作成します.binaryOperatorのタイプは、2つの数の和ではなく、2つの数の加算の行のコードです.
binaryOperator addExplicit = (Long x, Long y) -> x + y

Lambda式は、コンパイラによってパラメータのタイプを推定したり、パラメータのタイプを明示的に宣言したりすることができます.この場合、カッコで囲む必要があります.
四、目標タイプ:
Lambda                        
            Lambda        

Lambda式のタイプはコンテキスト環境に依存し、コンパイラによってJava初期化配列のように推定される場合、配列のタイプはコンテキストに基づいて推定され、nullを変数に割り当ててこそ彼のタイプを知ることができる.
final String[] array = { "hello", "Lambda" }

五,Lambda式のタイプ
Lambda式のタイプ:関数インタフェース(抽象メソッドが1つしかないインタフェース)
六、類型推定:
JAva 7は、ターゲットタイプ推定の拡張-菱形オペレータを導入し、javacに汎用パラメータのタイプを推定させることができます.たとえば、次のようにします.
Map map = new HashMap<>();

変数mapは菱形オペレータを使用しており、汎用タイプを明確に宣言する必要がなく、コンパイラはHashMapの汎用タイプを推定することができます.変数の汎用タイプを宣言する必要があることを前提としています.
Java 8は、Lambda式のすべてのパラメータタイプjavacを省略し、Lambda式のコンテキスト情報からパラメータを推定する正しいタイププログラムは、タイプチェックによって実行の安全性を保証しますが、明示的にタイプを宣言する必要はありません.これがタイプ推定です.
七、類型推定例-predicate:
Predicate atLeast5 = x -> x > 5

式x>5は、Lambda式のボディ戻り値がLambda式のボディの値である
public interface Predicate{
	boolean test(T t);
}

Predicateには汎用パラメータがあり、Lambda式はPredicateインタフェースを実現しているため、その単一パラメータはIntegerタイプjavacと推定され、Lambda式の戻り値がbooleanであるかどうかを調べることもでき、Predicateインタフェースのメソッド戻り値タイプである.
七、類型推定例-BinaryOperator:
このインタフェースは2つのパラメータを受け入れ、1つの値を返します.パラメータと値のタイプは同じです.
BinaryOperator add = (x, y) - > x + y;

タイプ推定システムはパラメータのタイプを推定できますが、情報が足りなければ、タイプ推定システムもできません.これはコンパイルエラーを報告します.
例:
BinaryOperator add = (x, y) - > x + y;

コンパイラがエラーを報告します.
Operator '& #x002B;' cannot be applied to java.lang.Object, java.lang.Object

コンパイラは、パラメータと戻り値がjava.lang.Objectインスタンスであると考えています.