闭包概述
闭包就是一个特殊的匿名代码块,可以传递参数,有返回值,还能作为方法的参数进行传递。
闭包格式
闭包的格式定义如下:
{ [closureParameters -> ] statements }
示例:
{ item++ } { -> item++ } { println it } { it -> println it } { name -> println name } { String x, int y -> println "hey ${x} the value is ${y}" } { reader -> def line = reader.readLine() line.trim() }
closureParameters :闭包参数是非必需的,与方法的参数十分类似,区别是:如果存在闭包参数,闭包参数与闭包语句之间需要使用箭头(->)的分割。
注意:如果没有指定参数,则默认存在一个it的参数,代表的是闭包本身。如下例子:
def obj = { println(it) } obj('hello')
statements:同样,闭包语句则可以类比于方法体,功能也相同。
变量可作为闭包的载体,原因是:闭包其实是Groovy中的Closure类的实例。如下三种示例:
def listener = { e -> println "Clicked on $e.source" } //指明为Closure类型实例 Closure callback = { println 'Done!' } //指明为Closure类型实例,并指定返回类型 Closure<Boolean> isTextFile = { File it -> it.name.endsWith('.txt') }
执行闭包有两种方式:一是直接调用;二是通过调用Closure的call方法。如下代码:
def obj = { def item = 10 return ++item } // 直接调用 println(obj()) //call调用 println(obj.call())
从字节码来看上述两种方式的区别:两种方式完全等效,都是通过call来完成
public Object test() { CallSite[] var1 = $getCallSiteArray(); class _test_closure1 extends