Вы можете сократить его немного больше с помощью 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
Я думаю, что этот кодна самом деле это более понятно, и это уменьшает количество итераций по списку и количество вызовов рефлексии, которые нам нужно сделать.