さて、Groovy 最大の特徴と言えば、Closure が使えること。
使ったことが無いという人も多いと思うので、一体どんなものなのか
早速紹介する。
square = { it * it }
println square(9)
上のコードは、Closure を使っている。大方の予想通り、81 と表示される。
Java で書くと、次のようになるだろう。
int square(int it) { return it * it; }
System.out.println(square(9));
これだけだと、Closure の素晴らしさを実感できないと思う。
では、次のコードはどうだろうか。
[ 1, 2, 3, 4 ].collect(square)
これは、[ 1, 4, 9, 16 ] を返す。
気付いただろうか。collect の引数に、square メソッドを渡している。
こんなことは Java では実現できない。
正確に言えば、square はメソッドではない。
記述を見ればわかるように、通常の変数定義と何ら変わりが無い。
だから square は変数だ。そして、{} で囲まれた部分が、Closure。
わかりやすく言えば、Closure とは「ブロック化されたコード」のこと。
Closure は、一度使い出したらその便利さに取り付かれる。
二度と Closure の無い言語には戻れない。
Java では非常に扱いにくかった正規表現。
それは何故か。僕が考える理由はただ一つ。何度も \ でエスケープしないといけないから!
これがコードを読みにくくしていた。
Groovy ではもちろんエスケープ処理なんか必要ない。
そして、構文自体が正規表現をサポートしている。
str = "abcde"
if (str ==~ /^a.*/) {
println "ok"
}
このように、==~ というオペレータが用意されている。
正規表現のグループも、より簡単に扱える。
locationData = "Liverpool, England: 53" matcher = (locationData =~ /([a-zA-Z]+), ([a-zA-Z]+): ([0-9]+)/)[0] println matcher[3]
これは "53" を出力する。
上記のように =~ というオペレータが用意されている。
これが matcher を返す。実体は、java.util.regex.Matcher を Groovy 用に拡張したものである。
鋭い人は、2行目の最後にある [0] に気付いたかもしれない。
普通に =~ を使うと、なぜか Groovy はサイズ1の配列を返してくる。
なので、使いやすいようにその先頭だけを取り出している。
なぜこのような仕様になってるのかは不明。
Groovy では、簡単にSQLを扱える。
import groovy.sql.Sql
sql = Sql.newInstance("jdbc:mysql://HOSTNAME/SCHEMA", "USER", "PASS", "com.mysql.jdbc.Driver")
sql.eachRow("select * from COUNTER_TOTAL", { println it.category + " -- ${it.count} --"} );
たったこれだけで、DBにアクセスできる。
これは便利。
JDBCのドライバ(jar)は予め GROOVY_HOME/lib に入れておく事。
sql.execute("insert into people (firstName, lastName) " +
" values (?,?)", [firstName, lastName])
こんな感じで、バインドも簡単。