条件分岐
続いて、制御構文についても見ていきましょう。まずは条件分岐です。これは、Javaと同じくif文で記述します。ifについては、ほとんどJavaと同じと考えてよいでしょう。ただし、条件の設定などで一部機能が拡張されています。
num = new Random().nextInt(100) if (num % 2){ println "${num}は、奇数" } else { println "${num}は、偶数" }
これは、100までのランダムな整数を作成し、偶数か奇数かを表示するものです。ifでは、njum % 2が条件として指定されています。Javaではifだと、条件はnum % 2 == 1というような形で指定する必要があるでしょう。が、Groovyの場合、「ゼロやnullはfalse、それ以外はtrue」と判断します。num % 2だけで真偽値の代りになるのです。
switch文
Groovyのswitch文はJavaに比べ強力です。caseでの値の指定に、整数以外の値を指定することができるのです。
val = new Random().nextInt(10) switch(val){ case [0,2,4,6,8]: println "${val}は、偶数" break case [1,3,5,7,9]: println "${val}は、奇数" }
これは、先ほどのランダムに数字を用意し偶数奇数を判定するプログラムをswitchで修正しました。おどろくべきは、caseに配列が渡されている点でしょう。valの値が、caseの配列内にあれば、それが実行されます。また値だけでなく、String,Integerというようなタイプ名を指定し「値がStringならこの処理を実行」というようなことも可能です。
繰り返し
Javaでは、繰り返しはforとwhile文で実現していました。Groovyにも、for構文はあります。ただし、構文の基本的な使い方はJavaとはかなり異なります。
for( 変数 in 配列 )
このようにして記述します。例えば、配列の要素をすべて合計するような例を考えてみましょう。すると、次のようになります。
arr = [1,2,3,4,5] n = 0 for(item in arr){ println("$n + $item = " + (n + item)) n += item } println "合計:$n"
もし、どうしてもJavaのようにfor(int i = 0;i < n;i++)
というような形式にこだわりたいのであれば、次のような書き方もあります。
n = 0 for(i in 0..5){ println("$n + $i = " + (n + i)) n += i } println "合計:$n"
ここでは、繰り返しはfor(i in 0..5)
というように記述されます。この0..5というのは「レンジ(Range)」と呼ばれる値です。これは、[0,1,2,3,4,5]
という配列と同じものと考えてよいでしょう。このように記述することで、カウンタ変数を利用したforと同じ感覚で記述できます。
もちろん、Javaと全く同じスタイルでforを使うことも可能です。例えば、今のサンプルならば次のように書くこともできます(ただし、一般的には動作速度などの点から、Groovyではあまり用いられないでしょう)。
n = 0 for(def i = 0;i < 5;i++){ println("$n + $i = " + (n + i)) n += i } println "合計:$n"
もう1つの繰り返しである「while」は、Javaとほとんど同じです。whileのあとに()をつけ、そこで繰り返しの条件を設定します。この場合も、ifの場合と同様、条件には真偽値以外の値を代入することができます。