回答:
これは、Javaでクロージャーを導入した先駆者の1人であるNeal Gafterのブログです。2007年1月28日の閉鎖に関する彼の投稿は、「閉鎖の定義」と名付けられています。彼のブログには、ビデオだけでなく、開始するための多くの情報があります。ここでは、優れたGoogleトーク- プログラミング言語の高度なトピック -Neal Gafterを使用したJavaのクロージャについても説明します。
クロージャーは、囲んでいるスコープの変数にアクセスして参照(および引き渡し)できるコードのブロックです。
Java 1.1以降、匿名の内部クラスがこの機能を非常に詳細な方法で提供しています。また、final
ローカル変数のみを使用できる(そして確実に割り当てられる)制限もあります。(非final
ローカル変数もスコープ内にありますが、使用できません。)
Java SE 8は、 "lambdas"と呼ばれる単一メソッドインターフェース*に対して、これをより簡潔なバージョンにすることを目的としています。ラムダには、匿名の内部クラスとほとんど同じ制限がありますが、詳細はランダムに異なります。
ラムダはProject LambdaとJSR 335で開発されています。
*元々、設計はより柔軟で、単一抽象メソッド(SAM)タイプを許可していました。残念ながら、新しいデザインは柔軟性が低くなりますが、インターフェイス内での実装を許可することを正当化しようとします。
トム・ホーティンによると
クロージャーは、囲んでいるスコープの変数にアクセスして参照(および引き渡し)できるコードのブロックです。
現在、私はWikipediaでJavaScriptクロージャーの例をエミュレートしようとしています。Javaへの「まっすぐな」変換を使用して、役立つことを期待しています。
//ECMAScript
var f, g;
function foo() {
var x = 0;
f = function() { return ++x; };
g = function() { return --x; };
x = 1;
print('inside foo, call to f(): ' + f()); // "2"
}
foo();
print('call to g(): ' + g()); // "1"
print('call to f(): ' + f()); // "2"
Javaの部分であるFunction1は、arity 1(1つの引数)を持つ「Functor」インターフェースです。ClosureはFunction1を実装するクラスであり、関数として機能する具体的なFunctor(int-> int)です。main()メソッドでは、fooをClosureオブジェクトとしてインスタンス化し、JavaScriptの例からの呼び出しを複製しています。IntBoxクラスは単なるコンテナーであり、1 intの配列のように動作します。
int a [1] = {0}
interface Function1 {
public final IntBag value = new IntBag();
public int apply();
}
class Closure implements Function1 {
private IntBag x = value;
Function1 f;
Function1 g;
@Override
public int apply() {
// print('inside foo, call to f(): ' + f()); // "2"
// inside apply, call to f.apply()
System.out.println("inside foo, call to f.apply(): " + f.apply());
return 0;
}
public Closure() {
f = new Function1() {
@Override
public int apply() {
x.add(1);
return x.get();
}
};
g = new Function1() {
@Override
public int apply() {
x.add(-1);
return x.get();
}
};
// x = 1;
x.set(1);
}
}
public class ClosureTest {
public static void main(String[] args) {
// foo()
Closure foo = new Closure();
foo.apply();
// print('call to g(): ' + g()); // "1"
System.out.println("call to foo.g.apply(): " + foo.g.apply());
// print('call to f(): ' + f()); // "2"
System.out.println("call to foo.f.apply(): " + foo.f.apply());
}
}
それは印刷します:
inside foo, call to f.apply(): 2
call to foo.g.apply(): 1
call to foo.f.apply(): 2
閉鎖の定義については、このWikiページを参照してください。
そして、Java 8での閉鎖に関するこのページ:http : //mail.openjdk.java.net/pipermail/lambda-dev/2011-September/003936.html
このQ&Aもご覧ください:Java 7のクロージャー
Java ClosuresはJ2SE 8の一部となり、2012年末までにリリースされる予定です。
Java 8のクロージャサポートには、ラムダ式、メソッドリファレンス、コンストラクタリファレンス、デフォルトメソッドの概念が含まれます。
詳細と作業例については、http://amitrp.blogspot.in/2012/08/at-first-sight-with-closures-in-java.htmlをご覧ください。
はい、Closure(ラムダ式)は、Java SE 8リリースの新機能です。この詳細については、以下のリンクから入手できます。http: //docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html
Java 5、6、および7のクロージャー実装
http://mseifed.blogspot.se/2012/09/bringing-closures-to-java-5-6-and-7.html
それは1つが求めることができるすべてが含まれています...