67

私がこの構造を持っていると想像してください:

class Foo {
   String bar
}

Fooここで、bar値がbaz_1baz_2、およびのインスタンスがいくつかあるとしzab_3ます。

bartext を含む値のみを収集する collect ステートメントを書きたいと思いますbaz。動作させることはできませんが、次のようになります。

def barsOfAllFoos = Foo.getAll().bar
assert barsOfAllFoos == [ 'baz_1', 'baz_2', 'zab_3' ]
def barsWithBaz = barsOfAllFoos.collect{ if( it.contains( "baz" ) { it } ) } // What is the correct syntax for this?
assert barsWithBaz == [ 'baz_1', 'baz_2' ]
4

3 に答える 3

100

必要なものfindAll:

barsOfAllFoos.findAll { it.contains 'baz' }
于 2012-10-12T20:40:09.740 に答える
52

フィルタリングと変換の両方が必要な場合は、これを行う方法がたくさんあります。1.8.1 以降#findResultsでは、スキップしたい要素に対して null を返すクロージャーを使用します。

def frob(final it) { "frobbed $it" }

final barsWithBaz = barsOfAllFoos.findResults {
    it.contains('baz')? frob(it) : null
}

以前のバージョンでは#findAll#collect

final barsWithBaz = barsOfAllFoos
                  . findAll { it.contains('baz') }
                  . collect { frob(it) }

または#sum

final barsWithBaz = barsOfAllFoos.sum([]) {
    it.contains('baz')? [frob(it)] : []
}

または#inject

final barsWithBaz = barsOfAllFoos.inject([]) {
    l, it -> it.contains('baz')? l << frob(it) : l
}
于 2012-10-12T23:21:31.413 に答える
1

を使用findResultsしてもうまくいきませんでした...条件に一致する値の変換されたバージョンを収集する場合 (たとえば、多くの行の正規表現検索) を使用collectして、findまたはfindAll次のように使用できます。

def html = """
    <p>this is some example data</p>
    <script type='text/javascript'>
        form.action = 'http://www.example.com/'
        // ...
    </script>
"""

println("Getting url from html...")
// Extract the url needed to upload the form
def url = html.split("\n").collect{line->
    def m = line =~/.*form\.action = '(.+)'.*/
    if (m.matches()) {
        println "Match found!"
        return m[0][1]
    }
}.find()

println "url = '${url}'"

これは、指定されたパターンに一致する行の部分を返します。

Getting url from html...
Match found!
url = 'http://www.example.com/'
于 2016-05-27T15:01:25.310 に答える