Groovy笔记(6)_闭包

<p><span style="font-size: medium;"><strong>闭包介绍</strong></span></p>
<p></p>
<p>1、由{}包围起来的代码块就是闭包</p>
<p> println{} //执行该行,结果如下:</p>
<p> <a href="mailto:com.clat.GroovyTest%24_run_closure1@10a2d43">com.clat.GroovyTest$_run_closure1@10a2d43</a></p>
<p>符合格式:类$匿名内部类@hash code</p>
<p> 结论: <span style="color: #3366ff;">闭包是一个匿名内部类的对象。</span></p>
<p></p>
<p><span style="color: #000000;">2、</span>也可以给闭包取名字:</p>
<p> def aClosure = {</p>
<p>println "Hello Closure!"</p>
<p> }</p>
<p> println aClosuer //结果如下:</p>
<p> <a href="mailto:com.clat.GroovyTest%24_run_closure2@89cf1e">com.clat.GroovyTest$_run_closure2@89cf1e</a></p>
<p></p>
<p></p>
<p><span style="font-size: medium;"><strong>调用闭包</strong></span></p>
<p></p>
<p>1、aClosure.call() //使用call()调用闭包</p>
<p>2、aClosure()//调用闭包的简写方式,类似于方法调用。</p>
<p>结论:闭包是一个可执行的代码块。</p>
<p>3、闭包在调用的时候才会执行</p>
<p>4、参数化闭包</p>
<p> def bClosure = {</p>
<p> println "Hello ${<span style="color: #ff0000;">it</span>}"</p>
<p> }</p>
<p> bClosure.call("clat")</p>
<p> bClosure("clat")</p>
<p> bClosure "clat" //结果输出三个: Hello clat</p>
<p><span style="color: #ff0000;">it 是闭包的单个隐含参数。</span></p>
<p></p>
<p></p>
<p><span style="color: #000000;"><span style="font-size: medium;"><strong>闭包参数</strong></span></span></p>
<p></p>
<p><span style="color: #000000;">1、闭包使用显示参数</span></p>
<p><span style="color: #000000;"> def cClosure = {name,address -> </span></p>
<p><span style="color: #000000;"> println "${name},${address}!"</span></p>
<p><span style="color: #000000;"> }</span></p>
<p><span style="color: #000000;"> cClosure("hello","clat") // 输出: hello, clat!</span></p>
<p><span style="color: #000000;">2、闭包支持默认参数</span></p>
<p><span style="color: #000000;"> def dClosure = {name,address="clat"-></span></p>
<p><span style="color: #000000;"> println "${name},${address}!"</span></p>
<p><span style="color: #000000;"> }</span></p>
<p><span style="color: #000000;"> dClosure("hello") //输出hello, clat!</span></p>
<p></p>
<p></p>
<p><span style="font-size: medium;"><strong>闭包作用域</strong></span></p>
<p></p>
<p></p>
<p>1、def name= "clat"</p>
<p> def eClosure = {println name}</p>
<p>eClosure() //输出: clat</p>
<p></p>
<p> //闭包可以作为方法的参数</p>
<p>def aMethod(Closure closure){</p>
<p>name="escaflone"; closure() //这里的name只是方法的局部变量,闭包不能访问</p>
<p>}</p>
<p> aMethod(eClosure) //输出: clat </p>
<p> </p>
<p> def fClosure = {</p>
<p> name="Aldern"; eClosure() //同样是闭包,能访问到name(其实就是可执行片段修改了外围的一个变量)</p>
<p>}</p>
<p> fClosure() //输出:Aldern</p>
<p></p>
<p></p>
<p><span style="font-size: medium;"><strong>闭包可以返回值</strong></span></p>
<p></p>
<p>1、def gClosure={number -></p>
<p> return number*2</p>
<p> }</p>
<p> println gClosure(3)</p>
<p></p>
<p>闭包返回6,其中return 可以省略</p>
<p></p>
<p></p>
<p><span style="font-size: medium;"><strong>闭包与集合、字符串</strong></span></p>
<p></p>
<p>1、闭包在Groovy中频繁出现,但最常用于对一系列值上迭代,如列表/映射/范围/String/File</p>
<p>2、闭包可以用更简洁的方式对集合进行迭代,已经不需要Java的迭代器了</p>
<p>3、用each遍历list:</p>
<p> def nameList = ["clat","escaflone","Aldern"]</p>
<p> nameList.each{name -></p>
<p>prinl name+ ' '</p>
<p> }</p>
<p> 输出 clat escaflone Aldern</p>
<p></p>
<p></p>
<p><span style="font-size: medium;"><strong>遍历Map,Range,GString</strong></span></p>
<p></p>
<p>1、遍历Map:</p>
<p> def nameMap = [1:'clat',2:'escaflone',3:'Aldern']</p>
<p> nameMap.each{name -></p>
<p> print name.key + ' ' + name.value + ' '</p>
<p> }</p>
<p>2、遍历Range</p>
<p> (1..<5).each{print it +'-'} // 1-2-3-4-</p>
<p>3、遍历GString </p>
<p> 'clat'.each{print it +'-'} //c-l-a-t-</p>
<p></p>
<p></p>
<p><span style="font-size: medium;"><strong>闭包为参数的迭代集合的方法</strong></span></p>
<p></p>
<p>1、boolean <span style="color: #ff0000;">any</span>(Closure clos)</p>
<p> 有一个集合元素满足闭包条件则返回true</p>
<p>2、List <span style="color: #0000ff;">collect</span>(Closure clos)</p>
<p> 把集合每个元素用闭包转换后返回列表</p>
<p>3、List <span style="color: #ff0000;">clooect</span>(Collection coll,Closure clos)</p>
<p> 把集合每个元素用闭包转换后放到coll中</p>
<p>4、bollean <span style="color: #0000ff;">every</span>(Closure clos)</p>
<p> 判断是否每个元素都满足闭包条件</p>
<p>5、List <span style="color: #ff0000;">findAll</span>(Closure clos)</p>
<p> 从集合中找到满足闭包条件的所有元素</p>
<p>6、Object <span style="color: #0000ff;">find</span>(Closure clos)</p>
<p> 从集合中找的满足闭包条件的第一个元素</p>
<p>7、int <span style="color: #ff0000;">findindexOf</span>(Closure clos)</p>
<p> 从集合中找到满足闭包条件的第一个元素的索引</p>
<p>8、Object <span style="color: #0000ff;">inject</span>(Object value,Closure clos)</p>
<p> value 与 第一个元素传给闭包,结果值与第二个集合元素又传给闭包,类推。(可以用来求阶乘)</p>
<p>9、void <span style="color: #ff0000;">reverseEach</span>(Closure clos)</p>
<p> 反向迭代</p>
<p>10、List <span style="color: #0000ff;">sort</span>(Closure clos) </p>
<p> 排序集合</p>
<p></p>
<p></p>
<p><span style="font-size: medium;"><strong>find()方法</strong></span></p>
<p></p>
<p></p>
<p>1、def value = [1,3,5,7,9].find{element -> element >6}</p>
<p> println "Found : ${value}" // Found : 7</p>
<p>2、value = [1,3,5,7,9].find{element -> element >10}</p>
<p> println "Found : ${value}" // Found: null</p>
<p>3、value = ["Java":21 , "Groovy" :22 , "Grails" :25].find{lang ->lang.value >21}</p>
<p> println "Found : ${value}" //Found : Groovy=22</p>
<p></p>
<p></p>
<p><span style="font-size: medium;"><strong>findAll()方法</strong></span></p>
<p></p>
<p></p>
<p>1、def values= [1,3,5,7,9].findAll{element -> element >6}</p>
<p> values.each{println it}</p>
<p> // 输出:7</p>
<p> 9</p>
<p>2、values=['Java':21,'Groovy':22,'Grails':25].findAll{lang -> lang.value >21}</p>
<p> values.each{prinln it}</p>
<p> //输出: Grails=25</p>
<p> Groovy=22</p>
<p></p>
<p><span style="font-size: medium;"><strong>any()与every()</strong></span></p>
<p></p>
<p></p>
<p>1、def anyElement = [11,12,13,14].any{element -> element >12}</p>
<p> //true</p>
<p>2、def allElement = [11,12,13,14].every{element -> element >10}</p>
<p> //true</p>
<p>3、def anyLang= ['Java':21 ,'Groovy':22,'Grails':25].any{lang -> lang.value>30}</p>
<p> // false</p>
<p></p>
<p></p>
<p><span style="font-size: medium;"><strong>collect()方法</strong></span></p>
<p></p>
<p>1、def list= [1,2,3,4].collect{element -> return element*element}</p>
<p> // [1,4,9,16]</p>
<p>2、list = (0..<5).collect{element -> 2*element }</p>
<p> // [0,2,4,6,8]</p>
<p>3、def lang = ['Java':21,'Groovy':22,'Grails':25]</p>
<p> list = lang.collect{entry -> ++entry.value}</p>
<p>def olderLang = lang.collect{entry -> ++entry.value ; return entry}</p>
<p> println "lang : ${lang}"</p>
<p> println "list: ${list}"</p>
<p> prinltn "olderLang: ${olderLang}"</p>
<p> //结果输出 lang:['Java':23,'Groovy':24,'Grails':27] //collect 会修改原数据</p>
<p> list:[22,23,26]</p>
<p> olderLang:[Java=23,Groovy=24,Grails=27]</p>
<p></p>
<p></p>
<p></p>
<p><strong><span style="font-size: medium;">inject()方法求阶乘</span></strong></p>
<p></p>
<p>1、def numList = [2,3,4,5]</p>
<p> factorial = numList.inject(1){<strong>previous</strong>, element -> <strong>previous</strong>*element} </p>
<p> // 输出: 120</p>
<p>2、numList = [2,3,4,5]</p>
<p> closure={<strong>previous</strong>,element -> <strong>previous</strong>*element}</p>
<p> factorial = numList.inject(1,closure)</p>
<p> // 输出 120</p>
<p></p>
<p></p>
<p></p>
<p><strong><span style="font-size: medium;">闭包的其他特性</span></strong></p>
<p></p>
<p>1、闭包可以嵌套。</p>
<p> def outerClosure = {country -> </p>
<p> println country</p>
<p>//嵌套定义闭包,方法则不运行</p>
<p> def innerClosure = {city -></p>
<p> println city</p>
<p> }</p>
<p> innerClosure('shanghai')</p>
<p> }</p>
<p> outerClosure('china') //先打印china 再打印shanghai</p>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值