groovy 闭包实战教程
闭包本质是一段匿名的代码块,如是:{ -> } ;
闭包是groovy.lang.Closure类型,因此可以作为参数传入方法,甚至闭包。
同时闭包也是一个方法,没有与之关联的类;因此,其可以有参数和返回值(其实还可以返回一个闭包)。
闭包总是返回代码块的最后一条语句,return关键字是可选的。闭包的方法体代码调用时才执行。
简单示例
这个闭包带有一个参数,把参数乘以2并打印出来,符合->后面的为闭包体。
然后把闭包作为参数传递给其他方法,示例代码如下:
def doubling = {arg1 -> println arg1*2 } println(doubling(5)) -- result is 10
上面代码也可以简化,默认闭包只有一个参数可以省略,用关键字it代替。
def doubling = { println it*2 }
闭包应用1————遍历
grovvy常用的接受闭包的方法有each、collect、find等。
[1,2,3,4].each( println it) – print 2,4,6,8
each方法在Groovy JDK中的java.lang.Object中,其参数为闭包,实现对集合的每个成员做确切的功能。上面代码对应的java代码如下:
List<Integer> list = Arrays.asList(1,3); for (Integer it :list) { System.out.println(it); }
闭包应用2————重构
class ExpensiveResource { def open() { println 'opened!' } def writeData(data) { println "data written! $data" } def close(){ println 'closed!'} }
为了使用这个类,代码如下:
def e = new ExpensiveResource() try { e.open() println e.data } finally { e.close() }
每次使用该资源是,open和close方法都必须被调用,使用闭包重构。
def safeResource(Closure closure) { def resource = new ExpensiveResource() try { resource.open() closure(resource) } finally { resource?.close() } } safeResource { it -> it.writeData('Hello World!') }
safeResource 方法接受闭包,封装资源管理代码,分离调用代码,使意图更清晰。
groovy采用了类似方法处理文件访问。通过闭包自动实现了打开、关闭、异常处理等场景。
实现函数式编程
下面的闭包实现过滤list的元素。
def filterList = { filter,list -> list.findAll(filter) }
然后定义两个实现过滤逻辑的闭包。
def even = { it % 2 == 0 } def odd = { !even(it) }
最后,我们创建两个新的闭包,通过在原闭包上使用curry函数。实现对偶数、奇数的过滤。
def evenFilterList = filterList.curry(even) def oddFilterList = filterList.curry(odd) assert [0,4,6,8] == evenFilterList(0..8) assert [1,5,7] == oddFilterList(0..8)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。