在列表上查找全部的Groovy过滤条件 [英] Groovy filter criteria on findAll on a list

查看:2279
本文介绍了在列表上查找全部的Groovy过滤条件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图在列表中使用findAll构建动态过滤器。我有一个变量,只有在不为空时才需要包含在过滤器中。

  @Test 
void testSample(){
def list = [new Employee(age:22, isManager:false),
新员工(年龄:23​​,isManager:true),
新员工(年龄:22,isManager:true)]设为

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

println list
println list.findAll {var? query1:query2} //应该给1个记录年龄= 22和经理
var = null;
println list.findAll {var? query1:query2} //应该给2个记录专用管理器

}

他们都给出了所有的记录。无论如何,我可以在一种情况下实现这一点,而无需编写多元查询?



看起来像下面这样(但这不起作用)

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


解决方案
  def list = [new Employee(age: 22,isManager:false),
新员工(年龄:23​​,isManager:true),
新员工(年龄:22,isManager:true)]设置

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

println list
println list.findAll(var?query1:query2)//应该给1个记录年龄= 22和经理
var = null;
println list.findAll(var?query1:query2)//应该给2个只记录管理器



编辑



您的意思是:

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

或者更好:

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


I trying to build dynamic filters using findAll on a list. I have a variable that needs to be included in the filter only if not 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

    }

Both of them giving all the records. Is there anyway I can achieve this in one condition without need to write muiltiple queries ?

Looking some like below (this doesn't work though)

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

解决方案

Try with Closures rather than Strings describing what you want to do:

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

Edit

Do you mean:

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

Or better:

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

这篇关于在列表上查找全部的Groovy过滤条件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆