任何想法,如何避免此处的 if 语句
Any idea, how to avoid if statements here
这是代码,
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
吗?
地图呢?
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
之类的东西抽象出来
为了使其可读性更差但重复性更低,您可以包含可搜索项目的地图并尝试这样的操作:
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')
}
这是代码,
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
吗?
地图呢?
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
为了使其可读性更差但重复性更低,您可以包含可搜索项目的地图并尝试这样的操作:
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')
}