Jcat
          寵辱不驚,閑看庭前花開花落~~
          posts - 173,comments - 67,trackbacks - 0

          1. 閉包代表(定義)了一段代碼(操作):光看這一句,其實方法也能實現相同的功能呀。
          2. 閉包可以作為方法的參數:這才是閉包的特殊之處和真正意義。


          下面演示一個只有閉包能做,方法做不到的例子。

          方法的作用是提煉共性,再代之以不同的參數。即對不同的“數據”進行相同的“操作”。從3個loop可以看出:
          ????Comm1:相同的數據
          ????Comm2:相同的for循環
          ????Diff1:循環體內執行的操作不同

          Comm1很好搞定,參數aa就是提煉出的共性
          Comm2看似是共性,卻很難提煉,因為for循環和循環體內的操作實際是一個整體;Comm2被Diff1糾纏,3個loop是完全不同的3組操作,無法提煉。

          比如,如果現在想要按照奇數循環,只能依次改動三個循環。?

          int []?aa? = ?[ 1 ,? 2 ,? 3 ,? 4 ,? 5 ,? 6 ]

          // ?loop1
          for ?( int ?i? = ? 0 ;?i? < ?aa.length;?i ++ )?{
          ????println?aa[i]
          }

          // ?loop2
          for ?( int ?i? = ? 0 ;?i? < ?aa.length;?i ++ )?{
          ????print?aa[i]
          }

          // ?loop3
          for ?( int ?i? = ? 0 ;?i? < ?aa.length;?i ++ )?{
          ????print?aa[i]?
          + ? ' ? '
          }
          ????????

          // ?loop1
          for ?( int ?i? = ? 0 ;?i? < ?aa.length;?i? += ? 2 )?{
          ????println?aa[i]
          }

          // ?loop2
          for ?( int ?i? = ? 0 ;?i? < ?aa.length;?i? += ? 2 )?{
          ????print?aa[i]
          }

          // ?loop3
          for ?( int ?i? = ? 0 ;?i? < ?aa.length;?i? += ? 2 )?{
          ????print?aa[i]?
          + ? ' ? '
          }


          下面我們看看閉包的強大之處,Comm1和Comm2都被很好的封裝在了loop方法里;Diff1則作為參數(閉包)傳入loop方法。

          static?void?main(String[]?a)?{
          ????
          int[]?aa?=?[1,?2,?3,?4,?5,?6]

          ????loop(aa)?{?println?it }
          ??? loop(aa)?{?print?it?}???
          ??? loop(aa)?{?print?it?
          +?'?'?}
          }
          如果我們想要改變循環的方式,只需要改一處
          static?void?loop(int[]?aa,?Closure?c)?{
          ????
          for?(int?i?=?0;?i?<?aa.length;?i++)?{
          ????????c.call(aa[i])
          ????}
          ????println?
          '?'
          }
          static?void?loop(int[]?aa,?Closure?c)?{
          ????
          for?(int?i?=?0;?i?<?aa.length;?i?+=?2)?{
          ????????c.call(aa[i])
          ????}
          ????println?
          '?'
          }

          總結,閉包本身并沒什么難點,關鍵是怎樣合理的設計一個接受Closure類型參數的方法。從GDK的方法也可以看出,大多數接受閉包的方法都是和數組迭代有關(也即循環)。
          posted on 2008-11-07 02:04 Jcat 閱讀(1551) 評論(2)  編輯  收藏 所屬分類: Java

          FeedBack:
          # re: Groovy Closure “操作”也成了參數[未登錄]
          2008-11-07 20:11 | 咖啡
          這個很熟悉. 好像有其他哪個語言類似的.   回復  更多評論
            
          # re: Groovy Closure “操作”也成了參數
          2008-11-07 21:37 | Jcat
          很多動態語言都有,如Ruby。Groovy正是借鑒了其它動態語言,將閉包引入了Java。另外,現在也正在討論,是否要在JDK7中加入閉包。  回復  更多評論
            
          主站蜘蛛池模板: 开阳县| 巍山| 宜良县| 武邑县| 城市| 文山县| 烟台市| 汉中市| 布尔津县| 抚顺市| 姜堰市| 即墨市| 抚州市| 东宁县| 青田县| 侯马市| 基隆市| 玛纳斯县| 阿坝县| 望城县| 齐齐哈尔市| 深泽县| 云梦县| 陇南市| 郎溪县| 吴旗县| 新巴尔虎左旗| 于田县| 莆田市| 钟山县| 个旧市| 巩留县| 新竹市| 曲阳县| 福建省| 上饶县| 丹阳市| 康保县| 中西区| 建水县| 临湘市|