C、C++、またはObjectiveCで書いた人にとって、Blocksは非常に簡単だと理解してください。 Java(8)でコンセプトを取得するのがなぜ難しいのですか?Javaブロック、クロージャ、Lambda ...簡単に説明しました
私は私の質問に答えます!
C、C++、またはObjectiveCで書いた人にとって、Blocksは非常に簡単だと理解してください。 Java(8)でコンセプトを取得するのがなぜ難しいのですか?Javaブロック、クロージャ、Lambda ...簡単に説明しました
私は私の質問に答えます!
あなたが理解する必要があるのは、「タイプ」です。
変数には型があります。例:
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の
ブロック
中括弧で囲まれたステートメントの一覧です。それで全部です。ブロックは、個々のステートメントを順番に実行することによって実行されます。これは、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.
あなたに貢献してくれてありがとうJames。 ブロックについては言及していませんでしたが、ブロックはAppleがC、C++、Objective-C(https://en.wikipedia.org/wiki/Blocks_%28C_language_extension%29)でClosuresやLambdasを追加しました。 あなたが説明することは、私が話したような種類の「ブロック」機能ではありません。私は私の心を正しく説明していませんでした。 –
これは実際の問題ではありません。特定の問題については問いません。 –
それは広すぎて、答えはいくつかの場所で不正確です。 – chrylis
JavaはCとC++に基づいているので、 '{} 'の動作はほとんど同じです。あなたの疑いが何であるか明確ではありません。 –