私はまだ Java 7 でクロージャを扱ったことがなく、それらがどのように機能するのか、それらを利用する上での主な利点または最良のユースケースは何なのか疑問に思っていました。
アップデート:
宿題をもっとやるべきだった。JSR 335のプロジェクト Lambda サイトは次のとおりです。Java プログラミング言語のラムダ式。彼らはクローシュアが Java 8 にあると主張しています。それが本当に当てはまるかどうかを確認するには、さらに調査する必要があります。
私はまだ Java 7 でクロージャを扱ったことがなく、それらがどのように機能するのか、それらを利用する上での主な利点または最良のユースケースは何なのか疑問に思っていました。
アップデート:
宿題をもっとやるべきだった。JSR 335のプロジェクト Lambda サイトは次のとおりです。Java プログラミング言語のラムダ式。彼らはクローシュアが Java 8 にあると主張しています。それが本当に当てはまるかどうかを確認するには、さらに調査する必要があります。
Java 7 にはクロージャがありません。彼らは長い間噂されてきましたが、どうやら Java 8 で登場するように設定されているようです。
ただし、匿名の内部クラスを使用してクロージャーを偽造することはできます。しかし、間違いなく、これらは閉鎖ではありません。
クロージャーの利点については、この投稿のスタック オーバーフローの伝説@jaifよりも優れているとは言えません。
「クラスの一般化として見ることができます。
あなたのクラスは何らかの状態を保持しています。メソッドが使用できるいくつかのメンバー変数があります。
クロージャーは、関数がローカル状態にアクセスできるようにするためのより便利な方法です。
関数で使用するローカル変数を認識しているクラスを作成する必要はなく、その場で関数を定義するだけで、現在表示されているすべての変数に暗黙的にアクセスできます。
従来の OOP 言語でメンバー メソッドを定義すると、そのクロージャーは「このクラスで表示されるすべてのメンバー」になります。
「適切な」クロージャーをサポートする言語は、これを単純に一般化するため、関数のクロージャーは「ここに表示されるすべての変数」です。「ここ」がクラスの場合、従来のクラス メソッドがあります。
「ここ」が別の関数内にある場合、関数型プログラマーがクロージャーと考えるものがあります。関数は、親関数で表示されていたすべてのものにアクセスできるようになりました。
したがって、「関数はクラス内でのみ定義できる」という愚かな制限を取り除き、「関数は、宣言された時点で可視である変数をすべて見ることができる」という考えを維持する、単なる一般化です。"