読者です 読者をやめる 読者になる 読者になる

No Programming, No Life

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

Groovy v1.8.1とv1.9-beta-1の新機能をサクっと紹介するよ

このシリーズの一覧はこちら

はじめに

2011-07-21にGroovy v1.8.1とv1.9-beta-1が同時リリースされたようなので、その新機能の一部をサクっと紹介します。

1. プリミティブ型演算のパフォーマンス最適化

割愛*1

2. ストリーミングビルダー(StreamingJsonBuilder)

StreamingJsonBuilder (Groovy 1.8.6)
JSONペイロードを直接writerに書き出したいとき(そして出力前にデータ構造を修正する必要がないとき)に使えるらしいです。ここでは動作確認としてv1.9-beta-1を利用しました。

import groovy.json.StreamingJsonBuilder
import groovy.json.JsonOutput

new StringWriter().with { w ->
  def json = new StreamingJsonBuilder(w) // <- Writerをストリーミングビルダに装着
  json.あんただれよ {
    なまえ 'ふも'
    おしごと 'プログラマ'
    すんでるところ (
      くに: '日本',
      とし: '名古屋'
    )
  }
  println JsonOutput.prettyPrint(w.toString()) // <- プリティーに出力
}
実行結果
{
    "あんただれよ": {
        "なまえ": "ふも",
        "おしごと": "プログラマ",
        "すんでるところ": {
            "くに": "日本",
            "とし": "名古屋"
        }
    }
}

Writer*2にJsonペイロード*3を吐き出せるようになったよ!って認識でいいんですよね?
JsonBuilderについてはこちらも参考にして下さい。

3. 2つのビルダーにPOGO/POJO(単にオブジェクトを値として渡す)用のシンプルなシリアライゼーションを追加

ん?どのビルダー?(調査中)

4. groovyshが変数名やメソッド名のタブ補完をサポート*4

ここでは動作確認としてv1.9-beta-1を利用しました。

とりあえず変数定義

f:id:fumokmm:20110723090747p:image
verylongvariablename のように長い名前を定義し、v まで入力したところ。

補完してみる

f:id:fumokmm:20110723090746p:image
この状態でタブを押したら変数名が補完されました!
長い名前を使っちゃったりした際には便利かもしれないですね。

さらに補完してみる

f:id:fumokmm:20110723090744p:image
.to まで打っておもむろにタブを押したらメソッド候補も補完されました!
ちょっとしたメソッドを調べるのに便利かもしれないですね。

5. いつものGDK改良

割愛*5

6. Java 7 Project Coin対応:数値リテラルでのアンダースコアの使用(v1.9-beta-1のみ)

assert 1_0_0 + 2_0_0 == 3____00

アンダースコアはいくらあっても無視される認識でいいんですよね?*6

7. Java 7 Project Coin対応:バイナリリテラル(v1.9-beta-1のみ)

assert 255 == 0b11111111

8. 複数の例外をまとめてキャッチするマルチキャッチ(v1.9-beta-1のみ)

// 適当に例外を定義
class HomuHomuException extends Exception{}
class HomaHomaException extends Exception{}
class HomeHomeException extends Exception{}

10.times {
  try {
    // ランダムで例外をスロー
    switch(new Random().nextInt(3)) {
      case 0 : throw new HomuHomuException()
      case 1 : throw new HomaHomaException()
      case 2 : throw new HomeHomeException()
    }
  } catch (HomuHomuException | HomaHomaException | HomeHomeException e) { // <- マルチキャッチ!
    println "thrown $e" // <- すべて変数eで受け取れる
  }
}
実行結果
thrown HomeHomeException
thrown HomuHomuException
thrown HomuHomuException
thrown HomeHomeException
thrown HomuHomuException
thrown HomuHomuException
thrown HomaHomaException
thrown HomuHomuException
thrown HomaHomaException
thrown HomuHomuException

まとめ

着実に進化しているGroovyを感じました。Keep on groovying!

*1:喜ばしいニュースなのですが、ベンチマークは環境に左右されるため、今回は割愛します。

*2:ここではStringWriterだけど、Writableならなんでもいける。

*3:私の中では "JSON文字列" という認識

*4:この機能ってたしかScalaのREPLにも導入されてた機能ですよね?

*5:これはまた[http://d.hatena.ne.jp/fumokmm/10000101/groovy_gdk:title=別の機会]に。

*6:3桁区切りなどの時に通常は利用しましょう。