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て Closure を取得し、要素が返される場合は要素を返す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

どちらが元の要件に近いですか(ただし、比較を囲む中括弧と?角括弧の後に a があります)

しかし、私見のfind方がはるかに読みやすいです:-/

于 2012-07-02T08:27:43.950 に答える