First they ignore you
          then they ridicule you
          then they fight you
          then you win
              -- Mahatma Gandhi
          Chinese => English     英文 => 中文             
          隨筆-221  評(píng)論-1047  文章-0  trackbacks-0

          在Groovy1.0中使用閉包和集合

          關(guān)鍵字: ? Groovy????
          1、閉包
          閉包是很多動(dòng)態(tài)語(yǔ)言提供的一個(gè)很方便的功能,它有點(diǎn)像Java中的內(nèi)部類,不同的是閉包中只有一個(gè)方法,但這個(gè)方法可以有任意個(gè)參數(shù)。
          java 代碼
          ?
          1. def?closure?=?{?param?->?println("hello?${param}")?}??
          2. closure.call("world!")??
          這段代碼會(huì)輸出”hello world”。
          • 閉包用“{}”括起,“->”前面是參數(shù),后面是處理語(yǔ)句,可以使用call調(diào)用,也可以在“{}”后直接使用“()”來(lái)執(zhí)行。
          • 閉包可以有多個(gè)參數(shù),各個(gè)參數(shù)用“,”隔開(kāi)。如果只有一個(gè)參數(shù)的話可以省略不寫,可以使用關(guān)鍵字“it”來(lái)代表。
          我們可以把上面的例子像下面這樣寫:
          java 代碼
          ?
          1. closure?=?{?println("hello?${it}")?}('world')??
          或者
          java 代碼
          1. closure?=?{?param1,param2->??
          2. ????????println(param1+param2)?}('hello?','world')??
          上面的幾種寫法都會(huì)輸出“hello world”。

          2、集合
          (1)List
          java 代碼
          ?
          1. def?list?=?[1,?2,?'hello',?new?java.util.Date()]??
          2. assert?list.size()?==?4??
          3. assert?list[1]==2??
          4. assert?list.get(2)?==?'hello'??
          (2)Map
          java 代碼
          ?
          1. def?map?=?['name':'James',?'location':'London']??
          2. assert?map.size()?==?2??
          3. assert?map.get('name')?==?'James'??
          4. assert?map['location']=='London'??
          (3)循環(huán)
          java 代碼
          ?
          1. def?list?=?[1,?2,?3]??
          2. for?(i?in?list)?{???
          3. ????print?i???
          4. }??
          5. println()??
          6. ??
          7. list.each{item->??
          8. ????print?item??
          9. }??
          10. println()??
          11. ??
          12. ['name':'yanhua','addr':'beijing'].each{println?it}??
          13. ['name':'yanhua','addr':'beijing'].each{key,value->println?"${key}?^_^?${value}"}??
          上面的運(yùn)行的結(jié)果如下:
          123
          123
          name=yanhua
          addr=beijing
          name ^_^ yanhua
          addr ^_^ beijing
          (4)collect
          遍歷集合,逐個(gè)傳遞給閉包,處理后的結(jié)果返回給對(duì)應(yīng)的項(xiàng)。
          java 代碼
          1. def?value?=?[1,?2,?3].collect?{?it?*?2?}??
          2. assert?value?==?[2,?4,?6]??
          (5)find
          根據(jù)閉包斷言,返回集合中找到的第一個(gè)項(xiàng)目。
          java 代碼
          1. def?value?=?[1,?2,?3].find?{?it?>?1?}??
          2. assert?value?==?2??
          (6)findAll
          根據(jù)閉包斷言,返回集合中所有找到的項(xiàng)目。
          java 代碼
          1. def?value?=?[1,?2,?3].findAll?{?it?>?1?}??
          2. assert?value?==?[2,?3]??
          (7)inject
          遍歷集合,第一次將傳遞的值和集合項(xiàng)目傳給閉包,將處理結(jié)果作為傳遞的值,和下一個(gè)集合項(xiàng)目傳給閉包,依此類推。
          java 代碼
          1. def?value?=?[1,?2,?3].inject('counting:?')?{?str,?item?->?str?+?item?}??
          2. assert?value?==?"counting:?123"??
          3. value?=?[1,?2,?3].inject(0)?{?count,?item?->?count?+?item?}??
          4. assert?value?==?6??
          (8)every
          如果集合中所有項(xiàng)目都匹配閉包斷言,就返回true,否則返回false。
          java 代碼
          1. def?value?=?[1,?2,?3].every?{?it?<?5?}??
          2. assert?value??
          3. value?=?[1,?2,?3].every?{?item?->?item?<?3?}??
          4. assert?!?value??
          (9)any
          如果集合中任何項(xiàng)目匹配閉包斷言,就返回true,否則返回false。
          java 代碼
          1. def?value?=?[1,?2,?3].any?{?it?>?2?}??
          2. assert?value??
          3. value?=?[1,?2,?3].any?{?item?->?item?>?3?}??
          4. assert?value?==?false??
          (10)min/max
          返回集合中的最小/最大項(xiàng)目(對(duì)象必須可比較)。
          java 代碼
          1. def?value?=?[9,?4,?2,?10,?5].max()??
          2. assert?value?==?10??
          3. value?=?[9,?4,?2,?10,?5].min()??
          4. assert?value?==?2?
          5. value?=?['x',?'y',?'a',?'z'].min()??
          6. assert?value?==?'a'??
          (11)join
          連接集合中的值成一個(gè)字符串。
          java 代碼
          1. def?value?=?[1,?2,?3].join('-')??
          2. assert?value?==?'1-2-3'??

          本文參考了http://blog.csdn.net/chenyun2000/archive/2004/09/15/104971.aspx這篇文章,針對(duì)Groovy1.0做了一些修改和擴(kuò)充。

          原文地址:http://yanhua.javaeye.com/blog/68164
          附:朝花夕拾——Groovy & Grails
          posted on 2007-05-13 20:14 山風(fēng)小子 閱讀(1273) 評(píng)論(5)  編輯  收藏 所屬分類: Groovy & Grails
          主站蜘蛛池模板: 揭东县| 平山县| 隆子县| 桃园市| 通辽市| 遵义县| 邹平县| 霍城县| 安平县| 安乡县| 浪卡子县| 七台河市| 新蔡县| 钟祥市| 湘乡市| 大邑县| 南溪县| 平邑县| 凤凰县| 徐闻县| 兴化市| 云林县| 隆回县| 喀喇沁旗| 安化县| 蛟河市| 普兰店市| 化隆| 肇庆市| 尉犁县| 武义县| 蓬溪县| 木里| 吉林市| 信阳市| 馆陶县| 威海市| 南宁市| 江北区| 井研县| 潼南县|