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

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

          關鍵字: ? Groovy????
          1、閉包
          閉包是很多動態語言提供的一個很方便的功能,它有點像Java中的內部類,不同的是閉包中只有一個方法,但這個方法可以有任意個參數。
          java 代碼
          ?
          1. def?closure?=?{?param?->?println("hello?${param}")?}??
          2. closure.call("world!")??
          這段代碼會輸出”hello world”。
          • 閉包用“{}”括起,“->”前面是參數,后面是處理語句,可以使用call調用,也可以在“{}”后直接使用“()”來執行。
          • 閉包可以有多個參數,各個參數用“,”隔開。如果只有一個參數的話可以省略不寫,可以使用關鍵字“it”來代表。
          我們可以把上面的例子像下面這樣寫:
          java 代碼
          ?
          1. closure?=?{?println("hello?${it}")?}('world')??
          或者
          java 代碼
          1. closure?=?{?param1,param2->??
          2. ????????println(param1+param2)?}('hello?','world')??
          上面的幾種寫法都會輸出“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)循環
          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}"}??
          上面的運行的結果如下:
          123
          123
          name=yanhua
          addr=beijing
          name ^_^ yanhua
          addr ^_^ beijing
          (4)collect
          遍歷集合,逐個傳遞給閉包,處理后的結果返回給對應的項。
          java 代碼
          1. def?value?=?[1,?2,?3].collect?{?it?*?2?}??
          2. assert?value?==?[2,?4,?6]??
          (5)find
          根據閉包斷言,返回集合中找到的第一個項目。
          java 代碼
          1. def?value?=?[1,?2,?3].find?{?it?>?1?}??
          2. assert?value?==?2??
          (6)findAll
          根據閉包斷言,返回集合中所有找到的項目。
          java 代碼
          1. def?value?=?[1,?2,?3].findAll?{?it?>?1?}??
          2. assert?value?==?[2,?3]??
          (7)inject
          遍歷集合,第一次將傳遞的值和集合項目傳給閉包,將處理結果作為傳遞的值,和下一個集合項目傳給閉包,依此類推。
          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
          如果集合中所有項目都匹配閉包斷言,就返回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
          如果集合中任何項目匹配閉包斷言,就返回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
          返回集合中的最小/最大項目(對象必須可比較)。
          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
          連接集合中的值成一個字符串。
          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這篇文章,針對Groovy1.0做了一些修改和擴充。

          原文地址:http://yanhua.javaeye.com/blog/68164
          附:朝花夕拾——Groovy & Grails
          posted on 2007-05-13 20:14 山風小子 閱讀(1272) 評論(5)  編輯  收藏 所屬分類: Groovy & Grails
          主站蜘蛛池模板: 永新县| 尤溪县| 淳化县| 盐城市| 吕梁市| 秦安县| 凌云县| 邢台县| 木兰县| 西青区| 梁山县| 江永县| 黄平县| 府谷县| 贡山| 新泰市| 密山市| 古交市| 红桥区| 台东县| 剑川县| 临桂县| 芜湖市| 秦安县| 潜江市| 双鸭山市| 栾城县| 红安县| 郧西县| 大港区| 鹿邑县| 沽源县| 浠水县| 锦屏县| 洞头县| 富阳市| 潢川县| 上林县| 泾源县| 长子县| 武强县|