Groovy-closures
Groovy-クロージャー
クロージャーは、コードの短い匿名ブロックです。 通常は数行のコードにまたがります。 メソッドは、コードのブロックをパラメーターとして受け取ることもできます。 それらは本質的に匿名です。
以下は、単純なクロージャーの例とその外観です。
class Example {
static void main(String[] args) {
def clos = {println "Hello World"};
clos.call();
}
}
上記の例では、コード行-\ {println "Hello World"}はクロージャーとして知られています。 この識別子によって参照されるコードブロックは、callステートメントで実行できます。
上記のプログラムを実行すると、次の結果が得られます-
Hello World
クロージャーの正式なパラメーター
クロージャーには、Groovyのメソッドと同じように、より便利にするための正式なパラメーターを含めることもできます。
class Example {
static void main(String[] args) {
def clos = {param->println "Hello ${param}"};
clos.call("World");
}
}
上記のコード例では、クロージャーがパラメーターを取得する$ \ {param}の使用に注意してください。 clos.callステートメントを介してクロージャーを呼び出す場合、クロージャーにパラメーターを渡すオプションがあります。
上記のプログラムを実行すると、次の結果が得られます-
Hello World
次の図は、前の例を繰り返して同じ結果を生成しますが、参照できる暗黙の単一パラメーターを使用できることを示しています。 ここで「それ」はGroovyのキーワードです。
class Example {
static void main(String[] args) {
def clos = {println "Hello ${it}"};
clos.call("World");
}
}
上記のプログラムを実行すると、次の結果が得られます-
Hello World
クロージャーと変数
より正式には、クロージャーは、クロージャーが定義されるときに変数を参照できます。 以下は、これを実現する方法の例です。
class Example {
static void main(String[] args) {
def str1 = "Hello";
def clos = {param -> println "${str1} ${param}"}
clos.call("World");
//We are now changing the value of the String str1 which is referenced in the closure
str1 = "Welcome";
clos.call("World");
}
}
上記の例では、クロージャーにパラメーターを渡すことに加えて、str1という変数も定義しています。 クロージャは、パラメータとともに変数も取ります。
上記のプログラムを実行すると、次の結果が得られます-
Hello World
Welcome World
メソッドでクロージャーを使用する
クロージャーはメソッドのパラメーターとしても使用できます。 Groovyでは、リストやコレクションなどのデータ型の多くの組み込みメソッドには、パラメーター型としてクロージャーがあります。
次の例は、クロージャーをパラメーターとしてメソッドに送信する方法を示しています。
class Example {
def static Display(clo) {
//This time the $param parameter gets replaced by the string "Inner"
clo.call("Inner");
}
static void main(String[] args) {
def str1 = "Hello";
def clos = { param -> println "${str1} ${param}" }
clos.call("World");
//We are now changing the value of the String str1 which is referenced in the closure
str1 = "Welcome";
clos.call("World");
//Passing our closure to a method
Example.Display(clos);
}
}
上記の例では、
- 引数としてクロージャーを受け取るDisplayという静的メソッドを定義しています。
- 次に、メインメソッドでクロージャーを定義し、パラメーターとしてDisplayメソッドに渡します。
上記のプログラムを実行すると、次の結果が得られます-
Hello World
Welcome World
Welcome Inner
コレクションと文字列のクロージャー
いくつかのList、Map、およびStringメソッドは、引数としてクロージャを受け入れます。 これらのデータ型でクロージャーを使用する方法の例を見てみましょう。
リストでクロージャを使用する
次の例は、クロージャーをリストで使用する方法を示しています。 次の例では、最初に値の単純なリストを定義しています。 リストコレクションタイプは、。 each という関数を定義します。 この関数は、パラメーターとしてクロージャーを取り、リストの各要素にクロージャーを適用します。
class Example {
static void main(String[] args) {
def lst = [11, 12, 13, 14];
lst.each {println it}
}
}
上記のプログラムを実行すると、次の結果が得られます-
11
12
13
14
マップでクロージャを使用する
次の例は、マップでクロージャーを使用する方法を示しています。 次の例では、最初にキー値アイテムの単純なマップを定義しています。 次に、マップコレクションタイプは.eachという関数を定義します。 この関数は、パラメーターとしてクロージャーを受け取り、マップの各キーと値のペアにクロージャーを適用します。
class Example {
static void main(String[] args) {
def mp = ["TopicName" : "Maps", "TopicDescription" : "Methods in Maps"]
mp.each {println it}
mp.each {println "${it.key} maps to: ${it.value}"}
}
}
上記のプログラムを実行すると、次の結果が得られます-
TopicName = Maps
TopicDescription = Methods in Maps
TopicName maps to: Maps
TopicDescription maps to: Methods in Maps
多くの場合、コレクションのメンバー全体を反復処理し、要素が何らかの基準を満たしている場合にのみ何らかのロジックを適用したい場合があります。 これは、クロージャーの条件ステートメントで簡単に処理できます。
class Example {
static void main(String[] args) {
def lst = [1,2,3,4];
lst.each {println it}
println("The list will only display those numbers which are divisible by 2")
lst.each{num -> if(num % 2 == 0) println num}
}
}
上記の例は、リスト内の各項目が2で割り切れるかどうかを確認するために使用されるクロージャーで使用される条件付きif(num%2 == 0)式を示しています。
上記のプログラムを実行すると、次の結果が得られます-
1
2
3
4
The list will only display those numbers which are divisible by 2.
2
4
クロージャーで使用されるメソッド
クロージャー自体がいくつかのメソッドを提供します。
Sr.No. | Methods & Description |
---|---|
1 |
findメソッドは、コレクションにある基準に一致する最初の値を見つけます。 |
2 |
クローズ条件に一致する受信オブジェクト内のすべての値を検索します。 |
3 |
メソッドanyは、ブール述語が少なくとも1つの要素に対して有効かどうかを確認するコレクションの各要素を反復処理します。 |
4 |
メソッドcollectはコレクションを反復処理し、クロージャーをトランスフォーマーとして使用して各要素を新しい値に変換します。 |