2012-07-02 87 views
0

使用Groovy 2.0GPATH做谓语用比较表达式

是否有可能与GPATH属性表达式来利用谓词来过滤:

class HandShaker { 
String title 
} 

class AussieGreeter implements Greeter { 
String name 
List<HandShaker> handshaker 
    .... 
} 

AussieGreeter greeter = new AussieGreeter() 
greeter.setName("hello") 
greeter.setHandshaker([new Handshaker().setTitle("butler")].asList()]) 

println Eval.x(greeter,"x[name=='hello'].handshaker[0].title") 

要过滤的迎宾员,如果name属性等于“你好“?没有看到像这样的例子,Groovy使用MissingPropertyException保存。

+0

如果这不能与GPath完成,我不兴奋与OGNL或MVEN别人做什么? –

+0

测试过:println Eval.x(greeter,“x.find {it.name =='hello'}。handshaker [0] .title”)它的工作原理,就像实际谓词的简写。 –

回答

1

我认为你需要做的:

println Eval.x(greeter,"x.find { it.name == 'hello' }.handshaker[0].title") 

你能砍的getAt方法AussieGreeter采取关闭,并返回的元素,则将返回truenull否则,像这样:

class HandShaker { 
    String title 
} 

interface Greeter {} 

class AussieGreeter implements Greeter { 
    String name 
    List<HandShaker> handshaker 

    def getAt(Closure o) { 
    o.delegate = this 
    o.resolveStrategy = Closure.DELEGATE_FIRST 
    o() ? this : null 
    } 
} 

AussieGreeter greeter = new AussieGreeter(name:'hello', 
              handshaker:[new HandShaker(title:'butler')]) 

greeter[ { name == 'hello' } ]?.handshaker[0].title 

这更接近您的原始要求(但方括号后面的圆括号和?

find是更容易阅读imho: -/

+0

这就是我的评论。希望能够像XPath中的谓词过滤器一样使用更简洁的方式。如果存在。或者如果人们选择另一种像JXPath的替代方案呢? –

+0

@MatthewYoung是的,你添加了你的第二个评论后,我添加了这个答案。没有什么我能想到的,它符合你的要求 –

+0

getAt运算符是正在应用的,所以也许使用正确的输入覆盖可能会这样做:greeter.metaClass.getAt = { \t \t \t字符串谓词 - >返回Eval.x (代表,“x.find {$谓语}”) \t \t} –