Java 7での閉鎖[終了]


105

閉鎖とは何ですか?Java 7に含まれることになっている(クロージャはJava 7に含めるために議論されたが、最終的には含まれていなかった。-ed)缶誰でも私は、クロージャについてのものを学ぶことができるところから、いくつかの信頼性の参照を私に提供してください?

回答:


59

これは、Javaでクロージャーを導入した先駆者の1人であるNeal Gafterのブログです。2007年1月28日の閉鎖に関する彼の投稿は、「閉鎖の定義」と名付けられています。彼のブログには、ビデオだけでなく、開始するための多くの情報があります。ここでは、優れたGoogleトーク- プログラミング言語の高度なトピック -Neal Gafterを使用したJavaのクロージャについても説明します。


2
ブログ全体より具体的なリンクはありますか?
I82Much


1
もし誰かが私のように馬鹿で、ハックがこのクロージャとは何かを知るために壁に頭をぶつけているなら...それからここに行く.. youtube.com/watch?v=Nj3_DMUXEbE
Piyush Kukadiya

最初はクロージャーを持っていなかった言語でクロージャーを実装することは想像できません。ちょっとクレイジー
アレクサンダーミルズ

アレクサンダーミルズはちょうど好奇心旺盛です。なぜですか?
Bartzilla

84

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

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

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

ラムダはProject LambdaJSR 335で開発されています。

*元々、設計はより柔軟で、単一抽象メソッド(SAM)タイプを許可していました。残念ながら、新しいデザインは柔軟性が低くなりますが、インターフェイス内での実装を許可することを正当化しようとします。


7

トム・ホーティンによると

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

現在、私は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 

2
名前のほかに、IMOはクロージャとは関係ありません
n00b


4

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

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

詳細と作業例については、http//amitrp.blogspot.in/2012/08/at-first-sight-with-closures-in-java.htmlをご覧ください。


1
うーん、しかし、Java 8はクロージャー変数の変更を許可していません。良い記事。
nawfal 14


0

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

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

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


リンクはそれを説明するテキストに移動しますが、そのページからリンクされているコードは存在しません。実装はどこですか?
ジェリージェレミア

@JerryJeremiahここでは、名前が異なりますが、元々存在するすべてのバージョンは存在しません(最終クラス以外のアクセスをサポートするために、抽象クラスを介して、さらに追加されます<Java 8バージョンでは、どのプラットフォームですか?探していますか?):bitbucket.org/momomo/opensource/src
mmm

2
リンクが壊れています!
サンレオ

404リンクが死んでいます
Alexander Mills

リンクが壊れている(これが回答としてリンクを配置すべきでない理由です...)
OhadR
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.