grails - 任何想法,如何避免if语句在这里

标签 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', filter.email)
        if (filter.status) eq('status', filter.status)
        if (...) ...
        .
        .
        order(filter.sort, 'desc')
        order('name')
    }

有什么办法可以避免if

最佳答案

那 map 呢?

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 之类的东西来抽象curry参数

关于grails - 任何想法,如何避免if语句在这里,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40459672/

相关文章:

c# - 实现 if else 语句的通用方法

c++ - 更新代码库以满足标准

eclipse - 如何在不使用更新站点链接的情况下为 Eclipse 安装 groovy 插件

eclipse - org.codehaus.groovy.control.MultipleCompilationErrorsException : startup failed: Script7. groovy:1:无法解析类

grails - 如何在多个 Grails 应用程序之间共享数据访问层(服务和域类)

grails - 实例化一个类,但它似乎被引用为null

tomcat - 在 Tomcat 上部署两个 Grails 应用程序会忽略一个数据源

scala - 如何使这段代码更实用

json - chalice 。 JSON。他的方法?

url - Grails插件filterPane relatedProperties不适用于java.net.URL