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:バグなのか仕様なのか要確認だなぁ。