web-dev-qa-db-ja.com

リスト上のfindAllのGroovyフィルター基準

リストでfindAllを使用して動的フィルターを構築しようとしています。 nullでない場合にのみフィルターに含める必要がある変数があります。

 @Test
    void testSample(){
        def list = [ new Employee(age:22, isManager:false), 
                     new Employee(age:23, isManager:true), 
                     new Employee(age:22, isManager:true) ] as Set

        def var = 22;
        String query1 = "it.age == var && it.isManager == true "
        String query2 = "it.isManager == true"

        println list
        println list.findAll { var ? query1 : query2 } // Should give 1 record age = 22 and manager
        var = null;
        println list.findAll { var ? query1 : query2 } // should give 2 records-only manager

    }

両方ともすべての記録を与えます。とにかく、複数のクエリを書く必要なく、1つの条件でこれを達成できますか?

以下のように見えます(これは動作しません)

println list.findAll{
                if(var) it.age == var &&
                it.isManager == true
        }
37
Kiran Chitturi

何をしたいのかを説明する文字列ではなくクロージャを試してください:

def list = [ new Employee(age:22, isManager:false), 
             new Employee(age:23, isManager:true), 
             new Employee(age:22, isManager:true) ] as Set

def var = 22;
Closure query1 = { it.age == var && it.isManager == true }
Closure query2 = { it.isManager == true }

println list
println list.findAll( var ? query1 : query2 ) // Should give 1 record age = 22 and manager
var = null;
println list.findAll( var ? query1 : query2 ) // should give 2 records-only manager

編集

もしかして:

println list.findAll{ ( var ? it.age == var : true ) && it.isManager == true }

またはそれ以上:

println list.findAll{ ( var != null ? it.age == var : true ) && it.isManager == true }
43
tim_yates