我尝试在列表上使用 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
}
最佳答案
尝试使用闭包而不是字符串来描述您想要执行的操作:
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 }
关于列表中 findAll 的 Groovy 过滤条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18136616/