v1.8リリースノートより。v1.8の新機能をサクっと紹介したいと思います。v1.8は結構多くの機能拡張がなされておりますので、サラっと行きたいと思います。v1.8以前まではトップレベルでのメソッド呼び出しの括弧は省略できませんでしたが、新しいコマンドチェーン機能を使えば括弧なしのメソッド呼び出しが可能になります。同等となるようなことです。複数メソッドやクロージャ、名前付き引数と一緒に機能して、さらに右側に連ねてゆくことができます。新しい構文でサポートされている例を見てみましょう。引数なしの場合は括弧が必要です。...と続いて、最後はプロパティアクセスになります。同様これをうまく利用するとこんなDSLが作れるようになる。詳細は解説しませんが、他の例はこちらにもっとたくさんあります。10.0以下は日本語メタプログラミングスタイルを使った例です。Grな日々(uehajの日記)も参考にしてださい。インクリメント・デクリメント・比較)。このバージョンでは違った型を混合で使うことはできません。混合で使うと最適化は行われません。"this"でのメソッド呼び出し時の引数がぴったり一致する場合、メソッドはダイレクトに呼び出されるようになります。これは実行時のメソッド動的呼出しの際には行われません。これらはまだ始まりに過ぎません。v1.8.xでは同様の最適化が行われる予定です。Integer以外のプリミティブ型の対応はまもなく行われるでしょう。Agentsなどの機能が使えるようになります。Edition(MEAP)の17章をチェックしてみて下さい。APIの中でも至る所で利用されています。v1.8でアノテーションパラメータとしてクロージャを利用する方法をご紹介します。クロージャはGroovyに関数型の味わいを与える重要な部分となっています。アノテーションパラメータJavaでは、アノテーションのパラメータとして使える型はString、プリミティブ型、アノテーションクラス、クラスとそれらの配列のみとなっています。v1.8ではクロージャをアノテーションのパラメータとして利用することができます(実際は互換性のため、内部的にクラスに変換されます)。check(d)例としてGContractsをご紹介します。宣言するため、アノテーションパラメータが多用されています。数学の授業で合成関数に慣れ親しんだのを思い出してみて下さい。それと同じようにクロージャ合成はクロージャ同士を合成して数珠繋ぎに呼び出して行く新しいクロージャを生成します。以下が実際に動作する例です。plus2)(3)さらに多くの例はテストケースをご参照下さい。末尾再帰最適化(TCO)(トランポリン)末尾再帰最適化ができるようになりました。Grな日々(uehajの日記)がとても参考になります。副作用なしのクロージャを用意して、結果のメモ化ができるようになりました。20)||<この例だと、plusというクロージャはa,bという引数の組み合わせで結果が決まるため一度呼び出された引数の組み合わせを覚えておいて(メモ化して)もう一度呼ばれた際に再利用できるようにするという仕組みです。メモ化するにもメモリを消費しますので、最大x個までメモ化する、とか、最低でもx個メモ化するという指定もできます。Grな日々(uehajの日記)がとても参考になります。実はv1.7の頃から出来ていたのですが、あらためて紹介するとのことで。カリー化する際、通常は引数を左からカリー化して行くのですが、これを右から行ったり、指定位置を直接カリー化することができるようになりました。Lifeもご参照下さい。ネイティブJSONサポートJSONのビルダーとパーサーを使うことで、ネイティブにサポートされるようになりました。Lifeもご参照下さい。AST)を構成しバイトコードに変換します。AST変換を使うことで、プログラマにこの処理へのフックを提供できます。(MEAP)の第9章などをご覧下さい。v1.8で使えるようになった変換のリストです。これらは同じようなコード記述を抑えたり、共通エラーを引き起こすようなコードを避けるようにしてくれます。@Logこのアノテーションを付けると、自動的にGroovyクラスにlogというプロパティ名でロガーを仕込んでくれるようになります。ロガーは4種類利用可能です。Car()@Fieldスクリプトで宣言した変数をフィールドとして他のメソッドなどから呼び出せるようにしてくれます。(の強化)パッケージスコープをクラスやメソッドやフィールドに与える。@AutoClone自動的に必要なメソッドを実装して、Cloneableなクラスにしてくれます。since}は、以下のようなクラスに変換されます。...}@AutoExternalizable自動的に必要なメソッドを実装して、Externalizableなクラスにしてくれます。since}は、以下のようなクラスに変換されます。...}@ThreadInterruptThreadがinterruptedされているかどうかのチェックを追加してくれます。CPU}@TimedInterrupt指定した時間経過するとThreadをinterruptしてくれるコードを追加してくれます。CPU}@ConditionalInterrupt条件を満たすとThreadをinterruptしてくれるコードを追加してくれます。アノテーションクロージャパラメータで条件を指定します。参照する値として@Fieldを指定しています。method...'}@ToStringtoString()メソッドを自動で追加してくれます。z:0)@EqualsAndHashCodeequalsとhashCodeメソッドを追加してくれます。c2.hashCode()@TupleConstructorタプルベースのコンストラクタを自動で追加してくれます。Groovyは通常の場合はマップベースのコンストラクタのみがデフォルトで利用可能です。p2.age@Canonical@ToString、@EqualsAndHashCode、@TupleConstructorの機能の合成ですので、それぞれのメソッドが追加されます。age}@ToString、@EqualsAndHashCode、@TupleConstructorのうちで特定変換を追加すると、そこについては追加した内容が優先されます。age:15)@InheritConstructors親のコンストラクタを追加してくれます。}}以下のようにシンプルに書くことで、上記と同様になります。{}@WithReadLockと@WithWriteLockこの二つのアノテーションを使ってjava.util.concurrent.locksな機構を追加してくれます。}}は、以下のようなクラスに変換されます。}}@ListenerListもしコレクション型のフィールドを@ListenerListで注釈した場合、Beanのイベントパターンで必要な全てが生成されます。これはPropertyChangeEventsの@Bindableの独立したEventTypeの一種のようなものです。@ListenerListの簡単な使用法はList型のフィールドを注釈し、Listを総称型にすることです。この例ではMyListener型のリストを使います。MyListenerはメソッドが一つのインタフェースでパラメータとしてMyEventを受け取ります。listeners}これで以下のようなメソッドが作成されます。Coinの対応が完了しています。Grな日々(uehajの日記)を参照下さい。新たなDGM(DefaultGroovyMethods)のメソッドDGM(GDK)にも新たなメソッドが追加されたようです。Lifeの記事も参考にして下さい。variantscountの引数にClosureが渡せるようになりました。クロージャがtrueを返した数をカウントしてくれるみたいですね。5countByこちらはgroupByした結果のカウント数を保持してくれるようです。indexリストで要素を追加(plus)する位置をindexで指定できるようになったみたいです。Maps)SetとMapの数値比較が柔軟になったようです。CollectionsSetに変換してくれるtoSetがプリミティブ配列と文字列とコレクションにも付いたようです。closuresMapのminメソッド、maxメソッドにClosureが渡せるようになりました。maxを判定してくれるんですね。withDefault{}Mapでキーに対応する値がまだ格納されていなかった場合のデフォルト値が指定できるようになりました。以下の例は、各単語の出現数をカウントする例ですね。1}withDefaultを使うと、以下のように書けるようになりました。1}これについては、[http://d.hatena.ne.jp/uehaj/20100608/1275951180:title]あたりを参考にしていただくと理解が早いです。その他スラッシュ文字列スラッシュ文字列が複数行でも使えるようになりました。4これは特に複数行で正規表現をフリースペースコメントスタイルで使いたい場合などに便利です(でもまだスラッシュをエスケープする必要がある)。}ドルスラッシュ文字列これは複数行のGStringに似ている新しい文字列表記です。違いはスラッシュをエスケープしなくてよくなったところです。dollarSlashyこれは自然にスラッシュやバックスラッシュを含んでいるような文字列の表記に利用できます。$/C:\temp\/$コンパイルカスタマイズCompilerConfigurationクラスを通して、Groovyコードのコンパイルを設定することができます。(org.codehaus.groovy.control.customizersパッケージ)が追加されました。customizersを使うことによって3種類の方法でカスタマイズできます。@Log変換を全クラスとスクリプトに適用させたいなら以下のようにします。Car()""")デフォルトインポートを追加したいなら以下のようにします。coercion文字列からEnumへ強制変換できるようになりました。ColorマップでisCase()をサポートMapでisCase()が使えるようになったので、以下のようなswitch/case文などで利用できます。map"}Grape/Grabの向上@GrabResolverの略記法。特別なGrabリゾルバを書かなければならない場合、アーティファクトがMavenセントラルに格納されていない場合、以下のように書けました。v1.8では以下のように書ける略記法が追加されました。org.restlet.RestletGrab属性オプションのコンパクト記法@Grabアノテーションは沢山のオプションを持っています。commons-ioライブラリを使いたい場合は以下のような感じになります。force=true)コンパクト記法では追加属性は文字列で指定できるようになりました。0Sqlクラスの向上groovy.sql.SqlクラスのeachRowとrowsメソッドでページングがサポートされました。($row.url)"}結果として、2行目から始まって最大で2行が返されます。データベースにプロジェクト名とURLが入った多くのデータがある場合、以下のような感じの出力が得られるでしょう。(http://griffon.codehaus.org)ASTノードメタデータの格納AST変換を開発している際、特にASTノードのVisitorを使っている場合、訪れたツリー情報を保持しておくのは時々厄介です。そこで、ASTノードのベースクラスにメタデータを格納する機能を持った4メソッドが追加されました。key)GroovyDocテンプレートのカスタマイズ機能GroovyDocはハードコードされたテンプレートを使ってGroovyクラスのJavaDocを生成します。3つのテンプレート(トップレベルテンプレート、パッケージレベルテンプレート、クラステンプレート)が使われています。getClassTemplates()メソッドをオーバーライドして自分のテンプレートとして使うことができます。おわりにというわけで、新機能がこれでもかと盛り込まれています。@ListenerListの説明を追加。Tumblr広告を非表示にする関連記事2012-12-10メタプログラミングGroovy入門Groovy!(挨拶)最近Groovyであまり遊べていないfumokmmです。»プロフィールid:fumokmm新しいNPNLです。(2)はてなブログをはじめよう!fumokmmさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。