代码之家  ›  专栏  ›  技术社区  ›  Adeel Ansari

任何想法,如何避免这里的if语句

  •  0
  • Adeel Ansari  · 技术社区  · 8 年前

    这里是代码,

        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

    2 回复  |  直到 8 年前
        1
  •  1
  •   Will    8 年前

    地图怎么样?

    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

        2
  •  1
  •   V H    8 年前

    为了让它更不可读,但更不重复,您可以包括一个可搜索项目的地图,并尝试以下操作:

    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')
    }