首页IT科技go语言包管理(Groovy闭包深入学习 [203] 一直都有新高度 ITeye技术网站)

go语言包管理(Groovy闭包深入学习 [203] 一直都有新高度 ITeye技术网站)

时间2025-05-04 13:31:38分类IT科技浏览5586
导读:闭包...

闭包

1. 定义和执行闭包

Java代码
defone={num1,num2-> println"paramis:$num1&$num2" } one(2,3)//简便写法            。输出paramis:2&3 one2,3//省略()的等效写法 one.call(2,3)//使用call方法 one.call2,3//省略()等效写法
def one = { num1, num2 -> println "param is: $num1 & $num2" } one(2, 3) // 简便写法                    。输出 param is: 2 & 3 one 2, 3 // 省略()的等效写法 one.call(2, 3) // 使用call方法 one.call 2, 3 // 省略()等效写法

注意:

a) 闭包自身的定义写法       。在参数与具体代码执行端间的分隔符是->              ,老版本的是| b) 使用call方法                   ,或简便写法         。 c) 由于groovy可省略()      ,而引发的众多等效写法                   。 d) 单参数          ,可省略书写参数                    ,在闭包内使用it变量引用参数           。

2. 闭包作为参数返回

Java代码
defmakeClosure(name){ return{ println"Hello${name}" } } printlnmakeClosure(‘World’)//请问输出结果?
def makeClosure(name) { return { println "Hello ${name}" } } println makeClosure(‘World’) // 请问输出结果?

3. 闭包作为参数传递

Java代码
defrun(closure){ closure.call() } one={printlnHello,World!} run(one)
def run(closure) { closure.call() } one = { println Hello, World! } run(one)

4. 闭包使用外部变量

Java代码
classOneClosure{ defstaticexecute(closure){ defword=Cool//!!!注意不使用def的输出结果         ,理解方式使用引用 closure(Grails) } publicstaticvoidmain(args){ defword=Hello deftwo={param->println"${word}${param}"} two(Groovy)//输出HelloGroovy word=Wow two(Java)//输出WowJava OneClosure.execute(two)//输出WowGrails      ,而不是CoolGrails } }
class OneClosure { def static execute(closure) { def word = Cool // !!! 注意不使用def的输出结果                    ,理解方式使用引用 closure(Grails) } public static void main(args) { def word = Hello def two = {param -> println "${word} ${param}"} two(Groovy) // 输出 Hello Groovy word = Wow two(Java) // 输出 Wow Java OneClosure.execute(two) // 输出 Wow Grails            ,而不是Cool Grails } }

注意:

a) 闭包可使用(引用)闭包外部定义的变量 b) 变量的定义必须在闭包的上面   ,否则有groovy.lang.MissingPropertyException异常      。 c) 注意在代码标记出                    ,如果不使用def的输出差异                  。具体解释可使用引用来理解              。在一个闭包被定义后               ,使用的是闭包定义所在的外部对象,对于使用的外部对象的引用一直都不会改变(无论是否被作为参数传递)   。

5. 使用闭包实现单方法接口

Java代码
interfaceTest{ defone() } deftest={printlnone}asTest test.one()
interface Test { def one() } def test = {println one} as Test test.one() a) 使用关键字as

6. 使用闭包实现多方法接口

Java代码
interfaceTest{ defone() deftwo() } deftest=[ one:{printlnone}, two:{printlntwo} ]asTest test.one() test.two()
interface Test { def one() def two() } def test = [ one: {println one}, two: {println two} ] as Test test.one() test.two() a) 使用关键字as b) 使用Map, key为接口名,value为闭包
分享到:
声明:本站所有文章                 ,如无特殊说明或标注                  ,均为本站原创发布                  。任何个人或组织   ,在未征得本站同意时              ,禁止复制              、盗用                   、采集      、发布本站内容到任何网站          、书籍等各类媒体平台                 。如若本站内容侵犯了原著者的合法权益                   ,可联系我们进行处理。

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
wordpress app插件(用WordPress展示产品插件的魅力)