2016-03-28 7 views
-3

C、C++、またはObjectiveCで書いた人にとって、Blocksは非常に簡単だと理解してください。 Java(8)でコンセプトを取得するのがなぜ難しいのですか?Javaブロック、クロージャ、Lambda ...簡単に説明しました

私は私の質問に答えます!

+0

これは実際の問題ではありません。特定の問題については問いません。 –

+2

それは広すぎて、答えはいくつかの場所で不正確です。 – chrylis

+0

JavaはCとC++に基づいているので、 '{} 'の動作はほとんど同じです。あなたの疑いが何であるか明確ではありません。 –

答えて

-2

あなたが理解する必要があるのは、「タイプ」です。

変数には型があります。例:

int i, double d… 

オブジェクトには型(クラス)があります。例:

String s, Number n, Object o, MyClass m… 

機能にはタイプがあります。例:

void function() <= this type is: a function with no return and no param. 
void function (type param) <= this type is: a function with no return with a param of type ‘type’ 
type function (type param) <= this type is: a function with a return of type ‘type’ and a param of type ‘type’ 

ブロック/クロージャ/ラムダとは何ですか?

基本的には、他の関数にパラメータとして渡される特定の型のローカル関数です。

私たちは、特定の型の関数をパラメータとして取ります。 機能を受け取り起動する機能!

主な用途は、CallBackとComparaisonの機能です。しかし、夢は開いている。

私たちはそのように描くことができます:Javaでこれを言うためにどのように

type function(type function_param) { 
    excute the function_param 
} 

1 /ブロック/閉鎖/ラムダ

2/PARAMようなタイプのようなものを取得する機能(クラスかどうか)を作成

3 /作成ローカル関数の型を宣言ブロック/クロージャー/ラムダのタイプのブロック

4 /それを使用する関数にparamとして渡します。

例:

// 1 declaring the type of block/closure/lambda 
interface CallBack { 
    public int function(String string); 
} 

class MyClass { 
    private String name; 
    MyClass(String name) { this.name = name; } 
    void display() { System.out.println(this.name); } 

    // 2 creating the function that which that kind of type as param 
    int myFunction(CallBack funcCallBack) { 
     return funcCallBack.function(name); 
    } 
} 


public class Main { 

    public static void main(String[] args) { 

     // 3 Create the local function of the type of the block/closure/lambda 
     CallBack message = (String string) -> { 
      System.out.println("Message: "+string); 
      return 1; 
     }; 

     MyClass mc = new MyClass("MyClass"); 
     mc.display(); 

     // 4 pass it as param to the function which use it. 
     int res = mc.myFunction(message); 
     System.out.println(res); 

    } 
} 

出力

MyClassの

メッセージ:MyClassの

2

ブロック

中括弧で囲まれたステートメントの一覧です。それで全部です。ブロックは、個々のステートメントを順番に実行することによって実行されます。これは、Rubyプログラミング言語などの「ブロック」と呼ばれるもののようなものではありません。

閉鎖

Javaはクロージャを持っていませんが、それは1のようなものがあります。

int limit = ...; 

Thread t = new Thread(new Runnable() { 
    @Override 
    public void run() { 
     for (int i=0 ; i<limit ; i++) { ... } 
    } 
}); 

run()メソッドのようにて見える場合も変数limit内を指し、外側のスコープですが、変数limitが効果的に不変でない限りコンパイルされません。本当にここで起こっていることは、匿名内部クラスがlimitという名前メンバ変数、およびlimitという名前引数をとり、その値がコピーによってコンストラクタに供給されている隠されたコンストラクタを持っていることであるからlimitの値周囲の範囲。

ラムダ

より煙と鏡。 Javaでのラムダ式の値は関数ではありません。機能インタフェースを実装する匿名の内部クラスのインスタンスです。私は上記に書いた同じコードは、Javaのラムダ式として、より簡潔に書くことができます

int limit = ...; 
Thread t = new Thread(() -> { 
    for (int i=0 ; i<limit ; i++) { ... } 
}); 

Java8は、1つのメソッドを宣言する必要があり@Functionalインターフェイスタイプのアイデアを紹介します。この場合、彼らは、それはそれはThreadコンストラクタによって受け入れられているだけのタイプだから、匿名クラスがRunnableインターフェイスを実装するために知っている、コンパイラは上記のコードを読み取るとjava.lang.Runnableクラスは@Functional

をするretconnedましたラムダ本体がrun()メソッドになる必要があることを知っています。これは唯一のメソッドです。Runnable.

+0

あなたに貢献してくれてありがとうJames。 ブロックについては言及していませんでしたが、ブロックはAppleがC、C++、Objective-C(https://en.wikipedia.org/wiki/Blocks_%28C_language_extension%29)でClosuresやLambdasを追加しました。 あなたが説明することは、私が話したような種類の「ブロック」機能ではありません。私は私の心を正しく説明していませんでした。 –

関連する問題