0

使用 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")

如果 name 属性等于“hello”,则过滤 Greeter?还没有见过这样的例子,Groovy 因 MissingPropertyException 而放弃。

4

1 回答 1

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更容易阅读恕我直言:-/

于 2012-07-02T08:27:43.950 回答