加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

groovy 闭包实战教程

发布时间:2020-12-14 16:42:10 所属栏目:大数据 来源:网络整理
导读:groovy 闭包实战教程 闭包本质是一段匿名的代码块,如是:{ - } ; 闭包是groovy.lang.Closure类型,因此可以作为参数传入方法,甚至闭包。 同时闭包也是一个方法,没有与之关联的类;因此,其可以有参数和返回值(其实还可以返回一个闭包)。 闭包总是返回代

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————重构

特别是一些资源使用前需要打开,最后需要关闭(如文件,jdbc等),我们定义一个ExpensiveResource类。

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采用了类似方法处理文件访问。通过闭包自动实现了打开、关闭、异常处理等场景。

实现函数式编程

curry方法只需要一个参数,从左到右绑定至参数列表,只有左边的参数有用。

下面的闭包实现过滤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)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读