No Programming, No Life

新しいNPNLです。http://d.hatena.ne.jp/fumokmm/ から引っ越してきました。

Scalaも素晴らしいけど、Groovyも素晴らしいですよ

id:nazokingさんが、java使いのためのScala の勉強のための資料作り scalaって素晴らしい いろいろ1 - nazonoDiaryという記事を書いていた。
ここでは、Scalaで書くとJavaよりも簡潔に書けるよとのことで紹介されているのですが、比較対象にGroovyが入っておらずJavaScriptRubyだったのがちょっと残念だったので*1「Groovyでもだいたい同じようなことができるよ!」ということで、今回の記事を書いてみました。

id:nazokingさんと同じ見出しで行ってみたいと思います。
(動作環境: Groovy Version: 1.7.2 JVM: 1.6.0_20)

すべてがオブジェクト

1.toString() 

デフォルト値付き引数

def hoge(a = 'aの初期値', b = 'bの初期値') {
  // do something
}

名前付き引数

def hoge(namedMap) {
  println "${namedMap.a} ${namedMap.b}"
}
hoge(a: 'aaa', b: 'bbb')

importで別名

import java.util.Date as D 
import java.sql.Date as SD 

def d = new D() 
def sd = new SD() 

override

Javaと同様に@Overrideアノテーション利用可。

javabeanが簡単に書ける

class Hoge { 
  def b 
} 
h = new Hoge() 
h.setB('a') 
println h.getB() // 'a'が表示 

Singletonの言語レベルサポート

@Singletonアノテーションを使うとできます。

@Singleton class T {}

複数行文字列リテラル

a = ''' 
hoge 
fuga 
''' 

最後に ; がなくても動く

動きます。

return が必要ない

最後の文の返す値が戻り値。Rubyと同じですね。

複数の値を返すTuple

たぶんGroovyの場合タプルではないんですが、同じようなことはできます。

def (n1, n2) = ['vlaue1', 'value2'] 
println n1 
println n2 

遅延評価

@Lazyアノテーションを使うとできます。

class Person {
    @Lazy pets = ['Cat', 'Dog', 'Bird']
}

ということで

コード量だったらScalaに負けてないと思う今日この頃。

*1:同じJVMで動く言語としてGroovyの認知度の低さが泣けて来ます><

*2:実は@Singletonとか@Lazyとかあまり知らなかったんですが、1.6からだいぶ強力になってるんですね。