在 Javascript 中,闭包可以做出许多精彩漂亮的活儿,同样,利用 Groovy 的闭包特性,也能实现在Java中需要很曲折才达到的任务(java7吗?是的,但还得等等我们的 Oracle 到2012了)。在 Groovy 社区,提及 Groovy,必会提到如影随形的 Grails, 下面我们通过一个实例体会一下 Groovy 闭包在 Grails 中的精彩运用。
假设我们要实现如下一个功能:在一个查询功能模块中,我想动态添加一些额外的查询条件,使得查询结果进一步缩小,按需返回不同的结果集。相比较最原始的 SQL 拼接,利用 Grails GORM 的强大威力再加上 Groovy 的闭包特性,实现将变得更加优雅和 Cool!
一. 首先定义 两个Domain
class 1 : Company
class Company{
...
String name
static hasMany = [departments: Department]
...
}
class 2 : Department
class Department {
...
String name
boolean enabled = true
boolean shared
int employeeCount //部门的员工数
Company owner //部门所属的企业
static belongsTo = [owner: Company]
static constraints = {owner(nullable: false)}
/**
*
* @param params 查询的通用参数Map. eg:[max:10, offset:20, sort:'name', order:'asc']
* @param otherParams 其他查询参数Map. eg:[ilikeName:'山东', callback:{...}]
* @return
*/
def availableList(params, otherParams) {
def c = createCriteria()
return c.list(max: params.max, offset: params.offset) {
if(otherParams.ilikeName)
ilike('name',"%${otherParams.ilikeName}%")
eq('blankItem', false)
eq('enabled', true)
if (otherParams.callback) {
Closure callback = otherParams.callback;
callback.delegate = c
callback()
}
order(params.sort, params.order)
}
}
...
}
二. 如何实现动态查询的构造呢,利用Groovy 弱类型语言的优势,在 otherParams Map 中存储一个动态构造的 GORM DSL 查询闭包即可。下面是调用代码:
...
def otherParams = []
otherParams.callback = {
eq('employeeCount', 3)
owner{
eq("id", Long.parseLong(params.ownerID))
}
}
Department dept = new Department()
def list = dept.availableList(params, otherParams)
...
上述调用代码意思是我想把查询的结果集进一步限制为“指定 的公司ID中,有3个员工的所有部门".
三.下面对几处关键代码加以解释:
1.
if (otherParams.callback) {
Closure _callback = otherParams.callback;
_callback.delegate = c
_callback()
}
如果在参数 otherParams 中定义了 key 为 ‘callback’ 的 Map Entry,则将其 value 为 GORM DSL 查询闭包传给 _callback 的这个 Closure 类型,随后,最关键的一点是 callback.delegate = c , 以使得此处能正确回调动态传入的 GORM DSL 查询闭包体
2.
otherParams.callback = {
eq('employeeCount', 3)
owner{
eq("id", Long.parseLong(params.ownerID))
}
}
在调用方的 otherParams 中增加一项 key 为 'callback' 的 Map Entry , 并构造了一个常规的 Grails DSL 查询闭包体,意思是"指定的公司ID中,有3个员工的所有部门".
至此,你就可以根据你自己的需要构造
otherParams.callback = {...}
。你还可以举一翻三,做出更多有创意的事情。
分享到:
相关推荐
Groovy是一种敏捷、动态的语言,它旨在减少Java的样板代码,同时提供了可选的动态类型、闭包、领域特定语言(DSLs)、构造器以及元编程能力。这些特性使得Groovy更加灵活,更适合快速开发。 Grails则是一个基于...
- **Groovy 闭包**:闭包是 Groovy 的一大特色,本书解释了闭包的概念以及如何在 Grails 中使用闭包编写简洁高效的代码。 - **Groovy 集合操作**:介绍了 Groovy 中集合的基本操作,以及如何利用这些特性来简化数据...
在Groovy1.8中,动态方法和属性的添加、删除或替换更加方便,这对于构建元数据驱动的应用程序或者AOP(面向切面编程)非常有用。文档会深入探讨元编程的各种技术,包括ExpandoMetaClass和MetaObjectProtocol。 ...
2. **闭包**:Groovy中的闭包类似于函数引用,可以作为参数传递,也可以存储在变量中。它们是Groovy强大的特性之一,1.8.9版本的文档会详细解释如何使用闭包进行函数式编程。 3. **GString**:Groovy的GString提供...
9. Groovy在Android开发中的应用:Groovy也可用于Android应用开发,利用GVM(Groovy Version Manager)可以方便地管理Groovy的版本,进而适用于不同的开发环境。 10. 高级特性:书的最后部分还介绍了一些高级特性,...
《Groovy in Action》是一本深入探讨Groovy语言的权威著作,它专为Java开发者设计,旨在提升他们在Java生态系统中的开发效率和灵活性。Groovy,作为Java平台上的一个热门动态语言,融合了脚本语言的简洁性和Java的...
总结而言,这个压缩包提供的是Groovy 2.4.3版本的二进制文件和相关文档,对于Java开发者来说,可以方便地引入Groovy到他们的项目中,利用Groovy的动态性和便利性提高开发效率。同时,文档可以帮助他们更好地理解和...
- **闭包**:Groovy中的闭包类似于其他语言中的匿名函数,但具有更强的灵活性和表达能力。它们可以作为参数传递给方法,也可以作为返回值从方法中返回。 - **元编程**:Groovy提供了一系列强大的元编程工具,包括AST...
Apache Groovy是一个强大的、动态的编程语言,专为Java虚拟机(JVM)设计,它在Java平台上提供了简洁、优雅的语法,同时保留了与Java的无缝集成能力。Groovy 2.5.0-beta-2是这个语言的一个重要版本,它在2017年11月9...
闭包在函数式编程中起到关键作用。 7. **GroovyShell和GroovyConsole**:这两个工具分别用于交互式地运行Groovy代码和调试Groovy脚本,对于学习和测试Groovy语法非常方便。 8. **Metaprogramming**:Groovy支持元...