GPathって便利かも

今日は GPath ネタ。

たとえば、java.lang.String クラスのメソッド名のリストを取得する場合、java だと以下のようになります。

List<String> methodNames = new ArrayList<String>();
for (Method m : String.class.getMethods()) {
    methodNames.add(m.getName());
}

でも、Groovyだとこれで済んじゃいます。

String.class.methods.name

つまり、"."が、単にプロパティを指しているわけではなく、XPathが如く、リスト以下のプロパティをすべて収集してくれているということですね。

リストがネストしている構造では、かなり重宝しそう。

GPath 侮り難し。


また、Groovy in Action の p209 によると、

list.property

list.collect{ item -> item?.property}

は同様とのこと。たとえば上記で、ある item が null なら、そのまま null を返してくれるということになる。


しかし、おいらの環境ではそうならない、、、。*1

[String, null, Integer].collect{ item -> item?.name} // ==> ["java.lang.String", null, "java.lang.Integer"]
[String, null, Integer].name                         // ==> NullPointerException

しかし、"*."を使えば OK っぽい。

[String, null, Integer]*.name                        // ==> ["java.lang.String", null, "java.lang.Integer"]

"list*.member" という書式で、member はフィールドアクセス、プロパティアクセス、メソッドコールを指定できるとのこと。

*1:バグなのか仕様なのか要確認だなぁ。