web-dev-qa-db-ja.com

Java 7の閉鎖

閉鎖とは何ですか? Java 7に含まれることになっています(Java 7に含めるためにクロージャが説明されましたが、最終的には含まれませんでした。-ed)クロージャーについて学ぶことができる信頼できる参考資料を誰でも私に提供できますか?

99
Swaranga Sarma

ここに Neal Gafterのブログ がJavaでクロージャを導入した先駆者の一人です。 2007年1月28日からのクロージャーに関する彼の投稿は、 A Closures の定義です。ここに素晴らしいGoogleトークがあります- プログラミング言語の高度なトピック-Javaのクロージャ とNeal Gafterも。

57
Bartzilla

クロージャーは、囲んでいるスコープの変数にアクセスして参照(および受け渡し)できるコードのブロックです。

Java 1.1以降、匿名の内部クラスは非常に冗長な方法でこの機能を提供しています。また、final(および確実に割り当てられた)ローカル変数のみを使用できるという制限もあります。 (注:final以外のローカル変数もスコープ内にありますが、使用できません。)

Java SE 8は、「ラムダ」と呼ばれる単一メソッドインターフェイス*向けに、これをより簡潔なバージョンにすることを目的としています。一部の詳細はランダムに異なりますが、ラムダには匿名内部クラスとほぼ同じ制限があります。

ラムダは Project Lambda および JSR 335 の下で開発されています。

*元々、設計はより柔軟で、Single Abstract Methods(SAM)タイプを許可していました。残念ながら、新しい設計は柔軟性に劣りますが、インターフェイス内での実装を許可することを正当化しようとします。

82

Tom Hawtin による

クロージャーは、囲んでいるスコープの変数にアクセスして参照(および受け渡し)できるコードのブロックです。

今、私は Wikipedia のJavaScriptクロージャの例を、Javaへの「] straigth 」変換でエミュレートしようとしています。便利である:

//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は、アリティ1(1つの引数)を持つ「ファンクター」インターフェースです。クロージャーは、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 
7
Rob Rosetti

閉鎖の定義については このwikiページ をご覧ください。

Java 8の閉鎖に関するこのページ: http://mail.openjdk.Java.net/pipermail/lambda-dev/2011-September/003936.html

このQ&Aもご覧ください: Closures in Java 7

5
anubhava

Java ClosuresはJ2SE 8の一部になり、2012年末までにリリースされる予定です。

Java 8のクロージャーサポートには、ラムダ式、メソッドリファレンス、コンストラクターリファレンス、デフォルトメソッドの概念が含まれます。

これに関する詳細と実際の例については、以下をご覧ください。 http://amitrp.blogspot.in/2012/08/at-first-sight-with-closures-in-Java.html

4
Amit Phaltankar

はい、クロージャー(ラムダ式)は、今後のJava SE 8リリースの新機能です。詳細については、以下のリンクから入手できます。 http://docs.Oracle.com/javase/tutorial/Java/javaOO/lambdaexpressions.html

3
Anurag Ratna

Java 5、6、および7のクロージャー実装

http://mseifed.blogspot.se/2012/09/bringing-closures-to-Java-5-6-and-7.html

それは1つが求めることができるすべてが含まれています...

0
momomo