Groovy探索之闭包 六
探索闭包的应用是一件很有意思的事,它的有意思在于我们永远不知道有哪些地方不能应用到闭包,或者说在每一个角落,你都能找到闭包让人眼睛一亮的应用。今天到谈到的是闭包的有关于DSL的应用。DSL应该是这两年才兴起的一个概念,有关它的一些知识,请查阅相关文档。
DSL的优越性在于它的接近自然语言,以及它的编码的方便和快捷。而闭包天生能够体现DSL的这些优越性,因此,它被选做DSL的一种实现就不足为奇了。
下面试着举出几个例子来说说闭包在这方面的应用。
比如,有一个公司的人事管理有这样的一些规定:员工每个月迟到3次会怎么,早退三次会怎么,请假三次又会怎么,等等,等等。
在实现这样的一个功能的时候,我们把员工的出勤记录分为这样的一些状态:“O”代表按时出勤;“L”代表迟到;“H”代表请假;“E”代表早退。
我们有一个TimeLog的类为员工做出勤记录:
class TimeLog
{
String id
String name
String[] states
}
假设一个员工的出勤记录是这样的:
def timelog = new TimeLog(id:'123',name:'tom')
def states = ['O','L','E','O','L','H','H','H',
'O','O','O','O','L','L','O','O',
'O','O','O','O','O','O','O','O',
'O','O','O','O','O','O']
timelog.states = states
应用闭包,我们可以写出如下的代码来:
def IfThreeTimes = {
state,timeLog,Closure closure ->
int i = 0
for(tl in timeLog.states)
{
if(tl == state&&i == 3)
{
closure.call()
break
}
elseif(tl == state)
{
i++
}
}
}
闭包名为“IfThreeTimes”,意思是“如果三次了”,很好理解。它的参数有“state”,代表的是状态,是什么三次了,迟到还是请假。“timeLog”是某一个员工的出勤记录。最后一个参数是一个闭包,“closure”指的是三次了以后要怎么处理,可能的处理有:扣工资,没有奖金,不能评优秀等等。
具体到如果我们要处理迟到的问题,我们可以使用curry方法再做一次抽象,代码如下所示:
def IfThreeTimesLate = IfThreeTimes.curry('L')
最后,我们来测试我们的DSL:
IfThreeTimesLate(timelog){
println'You will lose money'
}
结果为:
You will lose money
做这样的DSL编码是不是很有意思。下面再来看一个例子。
公司有各种各样的申请,如“请假申请”,“部门调动申请”,“求职申请”等等,这些申请都由相关人员进行批准或否决。
如请假申请类:
class Holiday
{
String id
String name
String beginDate
String endDate
String reason
boolean approved
}
下面还有一个求职申请类:
class Offer
{
String name
String reason
boolean approved
}
由上面的需求,我们可以创建如下的闭包:
def IfApproved = {
which,Closure closure ->
if(which.approved)
{
closure.call()
}
}
参数“which”是需要输入哪一种申请;同样,参数“closure”代表如果申请成功了的话,要做些什么。
def holiday = new Holiday(id:'123',name:'tom',approved:false)
def offer = new Offer(name:'mike',approved:true)
IfApproved(holiday)
{
println'You will have a holiday'
}
IfApproved(offer)
{
println'good, your offer is approved'
}
运行结果为:
good, your offer is approved
这个例子,除了使用到闭包,还使用到Groovy语言的动态特性,共同完成了这样一个DSL的编写。
上面的例子都很小,也很简单,但是能够帮助我们整理闭包在DSL方面的应用,我用来借以抛砖引玉,使得我们能够在今后的应用中写成更好的DSL来。
分享到:
相关推荐
6. **Grails框架**:如果对Web开发感兴趣,Groovy的Grails框架是值得探索的。它是一个基于Groovy的全栈框架,提供MVC架构,用于快速构建Web应用。 7. ** Grape**:Grape是Groovy自带的依赖管理系统,类似于Java的...
6. 深入理解Groovy与Java的互操作性,以便在既有Java项目中无缝引入Groovy。 五、实战项目实践 通过实际项目,将理论知识应用于解决具体问题,如构建自动化脚本、编写简单的Web应用、实现DSL等,以加深对Groovy的...
- **闭包**:Groovy的闭包是其强大的特性之一,它们可以作为函数参数,也可以用作控制结构的一部分,提供了高度的灵活性。 - **动态和静态类型**:Groovy允许在同一个程序中同时使用动态和静态类型,以平衡开发速度...
《Groovy in Action》这本书由Dierk König与Andrew Glover、Paul King、Guillaume Laforge以及Jon Skeet共同编写,是一本深入探索Groovy编程语言的权威指南。本书由Manning Publications出版,全面覆盖了Groovy语言...
- **闭包**:Groovy中的闭包类似于其他语言中的匿名函数,但具有更强的灵活性和表达能力。它们可以作为参数传递给方法,也可以作为返回值从方法中返回。 - **元编程**:Groovy提供了一系列强大的元编程工具,包括AST...
在"groovy_demo"项目中,我们将会探索Groovy的基础概念和核心特性,这对于初学者来说是一个很好的起点。下面将详细讨论Groovy的相关知识点。 1. **Groovy语法基础**: - **简洁性**:Groovy的语法比Java更为简洁,...
以上内容仅为Groovy入门的基础知识,Groovy还有更多高级特性如AST转换、GroovyShell、 Grape依赖管理等,等待你进一步探索。通过阅读《Groovy经典入门推荐版》PDF,你将能够全面了解这个语言,并迅速上手。
例如,Groovy支持闭包,这是一种强大的函数式编程概念,可以简化迭代和函数式操作。 Groovy与Java的互操作性是其一大亮点。由于Groovy代码可以无缝调用Java类库,开发者可以在已有的Java项目中轻松引入Groovy脚本,...
总的来说,"Groovy in Action"提供了全面的学习材料,配合API文档,可以帮助开发者迅速掌握Groovy的精髓,并将之应用到实际项目中。通过阅读这本书和实践其中的示例,你将能更好地理解和利用Groovy的强大力量,提升...
4. **函数式编程**:讲解Groovy支持的函数式编程风格,如闭包、集合操作、惰性计算等。 5. **高级主题**:涵盖Groovy 2中的新增特性,例如类型推断、静态类型检查等,以及如何使用Groovy构建领域特定语言(DSL)。 6. ...
《RxJava与Groovy结合:探索异步编程新境界》 RxJava,一款基于 Reactive Extensions 概念的库,为Java虚拟机(JVM)提供了一种声明式处理异步数据流的方式。它允许开发者以一种简洁、可读性强的方式来处理事件和...
Groovy是一种动态、灵活的编程语言,它在Java平台上运行,并与Java代码完全兼容。...通过学习和实践,你可以掌握使用Groovy开发简单交互式程序的技能,为进一步探索Groovy的高级特性和应用打下坚实的基础。
通过这个SDK,你可以充分体验Groovy的强大功能,例如闭包、元编程、动态类型和DSL(领域特定语言)的创建。同时,结合Gradle,你可以在大型项目中构建复杂的构建逻辑,提高开发效率。 总的来说,Apache Groovy SDK ...
- **第5章:闭包的工作原理**:深入分析了Groovy中的闭包(Closures),这是Groovy的一个关键特性,闭包使得编写简洁而强大的代码成为可能。 - **第6章:Groovy控制结构**:讨论了各种控制流程语句,如循环、条件判断...
3. **闭包**:Groovy中的闭包是其强大的特性之一,它可以被用作函数、数据结构和控制结构,类似于JavaScript的箭头函数。 4. **GString**:Groovy的GString(Groovy String)允许在字符串中嵌入表达式,使得字符串...
6. **运算符重载和元编程**: Groovy允许自定义运算符行为,并可以通过元编程动态修改类的行为。 ### Groovy实例 下面是一些简单的Groovy代码示例,展示其语法的简洁性: ```groovy // 定义一个类 class Person { ...
- **闭包增强**:Groovy的闭包(Closure)是其强大特性之一,1.8.0可能对闭包的语法和行为进行了优化,使其更接近Java 8的Lambda表达式。 - **GDK增强**:Groovy的Default Groovy Methods (GDK) 是Groovy语言的一...