No Programming, No Life

プログラミング関連の話題や雑記

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 のようにするだけで一気に展開できます。便利ですね。