在一个列表中使用Groovy筛选条件来查找所有内容的问题

44
我试图使用findAll在一个列表上构建动态过滤器。如果变量不为空,需要将其包含在过滤器中。
 @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

    }

他们两个都提供所有记录。有没有一种方法可以在一个条件下实现这一点,而不需要编写多个查询?

看起来应该像下面这样(尽管这并不起作用)

println list.findAll{
                if(var) it.age == var &&
                it.isManager == true
        }
1个回答

52

尝试使用闭包而不是字符串来描述您想要做什么:

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 }

那个方法可以用,但我想要的是动态构建查询,这样最终只需要执行一个查询。就像这样:println list.findAll{if(var) it.age == var && it.isManager == true}. 不过这个方法不起作用。 - Kiran Chitturi
@KiranChitturi 在问题中提到这一点可能会更方便... 也许编辑问题并放置一个你想要得到的示例? - tim_yates
@time_yates 根据建议更新了我的问题。 - Kiran Chitturi
@KiranChitturi 更新了答案... 你是指那样吗? - tim_yates
@KiranChitturi 很高兴能帮忙,顺便说一下我已经添加了另一个更新,最好检查 var == null,这样 0'' 就不会让你出错了。 - tim_yates
@tim_yates 我还没有见过年龄为“0”的员工。:P - dmahapatro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接