Groovy Gpath使用比较表达式执行谓词

Groovy Gpath使用比较表达式执行谓词,groovy,predicate,gpath,Groovy,Predicate,Gpath,使用Groovy 2.0 GPath属性表达式是否可以使用谓词进行筛选: class HandShaker { String title } class AussieGreeter implements Greeter { String name List<HandShaker> handshaker .... } AussieGreeter greeter = new AussieGreeter() greeter.setName("hello") greeter.se

使用Groovy 2.0

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")
类握手器{
字符串标题
}
类AussieGreeter实现了Greeter{
字符串名
列表握手器
....
}
AussieGreeter greeter=新的AussieGreeter()
greeter.setName(“你好”)
greeter.setHandshaker([new Handshaker().setTitle(“butler”)].asList())
println Eval.x(问候者,“x[name=='hello'].handshaker[0].title”)

如果name属性等于“hello”,是否要筛选问候者?我还没有见过这样的例子,Groovy bails没有MissingPropertyException

我认为你需要做:

println Eval.x(greeter,"x.find { it.name == 'hello' }.handshaker[0].title")
您可以对
AussieGreeter
getAt
方法进行黑客攻击,以进行闭包,如果返回
true
null
则返回元素,否则类似:

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
类握手器{
字符串标题
}
接口接线员{}
类AussieGreeter实现了Greeter{
字符串名
列表握手器
def getAt(关闭o){
o、 委托=此
o、 resolveStrategy=Closure.DELEGATE\u优先
o()?这是空的
}
}
AussieGreeter greeter=新的AussieGreeter(名称:'hello',
握手者:[新握手者(头衔:'butler')])
问候者[{name=='hello'}]?。握手者[0]。标题
这更接近您的原始需求(但在比较中有大括号,在方括号后有一个


但是
find
更容易阅读,imho:-/

如果GPath不能做到这一点,而且我对OGNL或MVEN不感兴趣,那么其他人会怎么做呢?测试:println Eval.x(greeter,“x.find{it.name=='hello'}.handshaker[0].title]),它可以工作,只是想要实际谓词的简写。这就是我评论中的内容。想要一种更简洁的速记方式,就像XPath中的谓词过滤器一样。如果存在这种情况。或者如果人们选择另一种替代方法,比如JXPath?@MatthewYoung是的,在我添加这个答案之后,你添加了第二条评论。我想不出任何符合您要求的方法getAt运算符就是要应用的,因此可能需要使用正确类型的覆盖:greeter.metaClass.getAt={String predicate->return Eval.x(委托,“x.find{$predicate}”)}@MatthewYoung在我的答案中添加了我所能想到的最好的方法,即使用
getAt
进行黑客攻击。。。