Grails 有什么想法吗,如何避免这里的if语句

Grails 有什么想法吗,如何避免这里的if语句,grails,groovy,refactoring,gorm,criteria,Grails,Groovy,Refactoring,Gorm,Criteria,这是密码 User.createCriteria().list(offset: filter.offset, max: filter.max) { if (filter.first-name) eq('firstName', filter.first-name) if (filter.last-name) eq('lastName', filter.last-name) if (filter.email) eq('email', filte

这是密码

    User.createCriteria().list(offset: filter.offset, max: filter.max) {
        if (filter.first-name) eq('firstName', filter.first-name)
        if (filter.last-name) eq('lastName', filter.last-name)
        if (filter.email) eq('email', filter.email)
        if (filter.status) eq('status', filter.status)
        if (...) ...
        .
        .
        order(filter.sort, 'desc')
        order('name')
    }
如果在这里,有什么办法可以避免吗?

地图呢

User.createCriteria().list(offset: filter.offset, max: filter.max) {
    [
        'firstName' : filter.first-name,
        'lastName'  : filter.last-name,
        'email'     : filter.email,
        'status'    : filter.status
    ].findAll { it.value }.each { eq it.key, it.value }

    order(filter.sort, 'desc')
    order('name')
}
它可以更加动态,只需列出属性名称


更新:使用闭包作为键怎么样

User.createCriteria().list(offset: filter.offset, max: filter.max) {
    [
        { eq 'firstName', it } : filter.first-name,
        { eq 'lastName', it }  : filter.last-name,
        { eq 'email', it }     : filter.email,
        { eq 'status', it }    : filter.status,
        { lt 'dob', it }       : filter.dob
    ].findAll { it.value }.each { it.key(it.value) }

    order(filter.sort, 'desc')
    order('name')
}
我相信
it
参数可以使用类似于的东西来抽象,那么地图呢

User.createCriteria().list(offset: filter.offset, max: filter.max) {
    [
        'firstName' : filter.first-name,
        'lastName'  : filter.last-name,
        'email'     : filter.email,
        'status'    : filter.status
    ].findAll { it.value }.each { eq it.key, it.value }

    order(filter.sort, 'desc')
    order('name')
}
它可以更加动态,只需列出属性名称


更新:使用闭包作为键怎么样

User.createCriteria().list(offset: filter.offset, max: filter.max) {
    [
        { eq 'firstName', it } : filter.first-name,
        { eq 'lastName', it }  : filter.last-name,
        { eq 'email', it }     : filter.email,
        { eq 'status', it }    : filter.status,
        { lt 'dob', it }       : filter.dob
    ].findAll { it.value }.each { it.key(it.value) }

    order(filter.sort, 'desc')
    order('name')
}

我相信
it
参数可以使用类似的东西进行抽象,为了使其更不可读,但重复性更低,您可以包括一个可搜索项目的地图,并尝试以下方法:

filter.searchList=[first-name:'firstName',last-name:'lastName',
email:'email', status:'status']
User.createCriteria().list(offset: filter.offset, max: filter.max) {
     filter.searchList?.each { k,v ->
      !(filter."${k}" ?: eq(v, filter."${k}")
     }
    .
    .
    order(filter.sort, 'desc')
    order('name')
}

为了减少可读性,但减少重复性,您可以添加一张可搜索项目的地图,并尝试如下操作:

filter.searchList=[first-name:'firstName',last-name:'lastName',
email:'email', status:'status']
User.createCriteria().list(offset: filter.offset, max: filter.max) {
     filter.searchList?.each { k,v ->
      !(filter."${k}" ?: eq(v, filter."${k}")
     }
    .
    .
    order(filter.sort, 'desc')
    order('name')
}

您可以使用groovy三元运算符。您可以使用groovy三元运算符。实际上,在我的例子中,键和属性名是不同的。不过,也可以这样做。另一个问题是,我需要的不仅仅是
eq
;有一些,比如,
ilike
ne
,一些关联的属性,等等。。但无论如何,这是个好主意+1我认为键/值应该颠倒,这样读起来就更简单了。。。很好的一点是,
if
findAll
)只在一个地方表示,并应用于一个集合。实际上,在我的例子中,键和属性名是不同的。不过,也可以这样做。另一个问题是,我需要的不仅仅是
eq
;有一些,比如,
ilike
ne
,一些关联的属性,等等。。但无论如何,这是个好主意+1我认为键/值应该颠倒,这样读起来就更简单了。。。一个很好的观点是,
if
findAll
)只在一个地方表达,并应用于一个集合。谢谢你的建议。谢谢你的建议。