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

No Programming, No Life

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

Groovyでは全要素に対してゲッターを呼ぶような時は*.の*が省略できる

はじめに

GPathって言うんでしたっけ?こういうの。
サンプルを見た方が早いので説明はそちらで。

コードで語る

まず、こんなクラスを用意する。

class A{ def getName(){ 'a' } }
class B{ def getName(){ 'b' } }
class C{ def getName(){ 'c' } }

そしてこいつらのインスタンスのリストを作る。

def list = [new A(), new B(), new C()]

そして、こう呼び出す。

assert list.name == ['a', 'b', 'c']

おぉ! .name だけでリストの全要素のゲッターが呼び出せましたね。
これって、Groovyではおなじみの *. 演算子のシンタクスシュガーだよなと思ってみたり。つまりこういうことです。

assert list*.name == list.name // 同じ意味
assert list*.name == list.collect{ it.name } // 同じ意味

まとめ

obj.getXxx().getYyy().getZzz() ... みたいにゲットし続けられるインスタンスを要素に持つものは単純に [obj, obj, obj].xxx.yyy.zzz のようにするだけで一気に展開できます。便利ですね。