我的问题真的是:“下面的代码示例可以更小吗?基本上,该代码示例旨在首先查看对象列表,找到最细粒度的对象(在这种情况下,它是分支),然后根据它的对象向后查询发现。
1-如果找到分支,则针对该分支返回findAllBy
2-如果找到部门,则对部门返回findAllBy
3-如果找到组织,则针对该组织返回findAllBy
目的是找到最精细的对象(这就是为什么顺序很重要)的原因,但是我是否需要有两个单独的块(一个用于定义对象,另一个用于检查它们是否存在)?或者可以将这两个执行合并为一个命令...
def resp
def srt = [sort:"name", order:"asc"]
def branch = listObjects.find{it instanceof Branch}
def department = listObjects.find{it instanceof Department}
def organization = listObjects.find{it instanceof Organization}
resp = !resp && branch ? Employees.findAllByBranch(branch,srt) : resp
resp = !resp && department ? Employees.findAllByDepartment(department,srt) : resp
resp = !resp && organization ? Employees.findAllByOrganization(organization,srt) : resp
return resp
我在想的是与此类似的东西:
def resp
resp = Employees.findAllByBranch(listObjects.find{it instanceof Branch})
resp = !resp ? Employees.findAllByDepartment(listObjects.find{it instanceof Department}) : resp
resp = !resp ? Employees.findAllByOrganization(listObjects.find{it instanceof Organization}) : resp
但我相信这会引发异常,因为这些对象可能为null
最佳答案
您可以使用findResult
来缩短它的长度,而不是使用需要在外部定义的变量进行for in循环:
def listObjects // = some predetermined list that you've apparently created
def srt = [sort:"name", order:"asc"]
def result = [Branch, Department, Organization].findResult { clazz ->
listObjects?.find { it.class.isAssignableFrom(clazz) }?.with { foundObj ->
Employees."findAllBy${clazz.name}"(foundObj, srt)
}
}
findResult
与find
相似,但是它从第一个非空项目而不是项目本身返回结果。它避免了在循环外需要单独的集合变量。编辑:我以前的行为与我认为您正在寻找的行为不太匹配(我认为其他答案也没有,但我可能会误解)。在执行findAllBy之前,您必须确保在列表中找到了某些内容,否则您可能会拉回您不想要的空项目。
在实际的生产代码中,我做的事情实际上有所不同。我将利用JVM类型的系统,只需遍历
listObjects
一次,并在找到第一个分支/部门/组织时将其短路,如下所示:def listObjects
def sort = [sort:"name", order:"asc"]
def result = listObjects?.findResult { findEmployeesFor(it, sort) }
... // then have these methods to actually exercise the type specific findEmployeesFor
def findEmployeesFor(Branch branch, sort) { Employees.findAllByBranch(branch, sort) }
def findEmployeesFor(Department department, sort { Employees.findAllByDepartment(department, sort)}
def findEmployeesFor(Organization organization, sort { Employees.findAllByOrganization(organization, sort)}
def findEmployeesFor(Object obj, sort) { return null } // if listObjects can hold non/branch/department/organization objects
我认为这段代码实际上更加清晰,它减少了我们遍历列表的次数以及需要进行的反射调用的次数。
关于grails - list.find(closure)并针对该值执行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6086039/