Groovyの書き方

Javaと同じ書き方をしていてはGroovyらしさが出ない。どのように記述するとGroovyらしくなるのか。

文末のセミコロンの省略

import aaa.bbb.ccc

println "aaaaa"

ちなみにimport staticは記述可能。ただし現バージョンではimport staticに*を使うとエラーになってしまう。

メソッド呼び出しの括弧の省略

printlnなどのメソッド呼び出しのパラメータの括弧を省略する。

println "aaa" + "bbb"

f.flush()

ただし、パラメータのないメソッドには括弧を付与して呼び出す必要がある。

Bean規約に従ったフィールド定義、アクセス

クラスのaaaというフィールドに対するgetter、setterが定義されている場合、下記のようにアクセスできる。

class A{
  private aaa
  void setAaa(aaa){this.aaa}
  String getAaa(){this.aaa}
}

def obj = new A()
obj.aaa = "foo"
println obj.aaa

拡張for

for(i in [1,2,3]){
  println i
}

Groovyではinがキーワードになっている。Javaのソースをコピペして利用する場合、エラーになるので注意。(streamでinとか変数名に使っているかも)

正規表現

Matcher m = "hoge.text foo.text" =~ /([^\s]+?)\.text/
  while(m.find()){
    println m.group(1) + ".txt"
  }
もしくは
// m.each{m0,m1->
// println m1 + ".txt"
// }

Mapのようなもの

def obj = ["key1":"val1","key2":"val2"]
空のMap
def obj2 = [:]

returnの省略

メソッドの最後に評価されたものが戻り値になるため、一貫してreturnを記述しないという書き方ができる。

String adder(arg){
  arg + 1
}

ファイルの一括読み込み

File f = new File("d:/path/foo.txt")
def contents = f.getText("UTF-8")
// 上記はもしくは def contens = f.text
f.close()

上記でファイルの内容を一度に取得できる。

3項演算子を2項に

def ret = "aaa" ?: "default"

上記のような記述で、?:の左がnullもしくは空文字だと右辺の値が返る。

パラメータ付き引数

名前付きの引数でメソッドを呼ぶことができる。メソッド側では仮引数のMapから名前をキーにしてパラメータを参照できる。

//呼び出し側
fn05(arg0:"foo",arg1:"bar")

//呼ばれる側
void fn05(map){
  println map["arg0"] + map["arg1"]
}

XMLの解析

ドキュメントにいろんなやり方が載っている。組み込みの機能でできるだけ簡単そうなもの。

def root = new XmlParser().parseText("<root><objects><object><id>aaa</id><name>bbb</name></object><object><id>aaa2</id><name>bbb2</name></object></objects></root>")
root.objects.object.each{
  println it.id.text() + ":" + it.name.text()
}