groovy中的闭包

groovy中的闭包

闭包是非常重要的,在groovy中,闭包是最有用的特性之一
闭包就是一个代码块,一个闭包相当于是一个定义好的方法

简单的例子

  1. 迭代
    闭包如果只有一个参数的话,我们可以使用隐藏参数it来表示,省略了->
Closure c = {println "$it"}

[1,2,3].each(c)
  1. 处理资源
    file的eachLine方法负责处理文件输入流的打开和关闭,这样避免你偶然的错误处理形成资源泄漏。
new File('myfile.txt').eachLine { println it }

声明闭包

  1. 我们可以在调用的时候传入闭包
.eachLine { println it }
  1. 可以提前声明好闭包,在调用的时候传入
Closure c = {println "$it"}
  1. 引用一个方法作为闭包,这个引用的闭包甚至可以重载
    使用.&即可把一个实例的方法声明成一个闭包
class MethodClosure {

    int compare(int x, int y) {
        return x <=> y
    }

    int compare(List list) {
        return list.size()
    }
}


def m = new MethodClosure()

def c1 = m.&compare

调用闭包

假设我们有一个引用x指向一个闭包,我们能通过x.call()来调用闭包,或者简单的x()

def adder = {int x,int y -> return x + y}

assert adder.call(1,2) == 3
assert adder(1,2) == 3

闭包的声明可以定义缺省值,当少传参数的时候缺省值就可以生效,如下

def adder = { x, y=5 -> return x+y }
assert adder(4, 3) == 7
assert adder.call(7) == 12

闭包的reture语句

在闭包体外面,任何出现return的地方都会导致离开当前方法,当在闭包体内出现return语句时,这仅仅结束闭包的当前计算,这是更加有限的,例如,当使用List.each时,从闭包的提前返回不会引起从each方法的提前返回——闭包仍旧会在list的下一个元素出现时被调用。

发布了156 篇原创文章 · 获赞 19 · 访问量 18万+

猜你喜欢

转载自blog.csdn.net/qq_36929361/article/details/104156535