minimize

事業拡大のため、新しい仲間を募集しています。
→詳しくはこちら

Closure

さて、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の配列を返してくる。
なので、使いやすいようにその先頭だけを取り出している。
なぜこのような仕様になってるのかは不明。

SQL

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])

こんな感じで、バインドも簡単。