<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

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

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


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

    方法的作用是提煉共性,再代之以不同的參數(shù)。即對不同的“數(shù)據(jù)”進(jìn)行相同的“操作”。從3個(gè)loop可以看出:
    ????Comm1:相同的數(shù)據(jù)
    ????Comm2:相同的for循環(huán)
    ????Diff1:循環(huán)體內(nèi)執(zhí)行的操作不同

    Comm1很好搞定,參數(shù)aa就是提煉出的共性
    Comm2看似是共性,卻很難提煉,因?yàn)閒or循環(huán)和循環(huán)體內(nèi)的操作實(shí)際是一個(gè)整體;Comm2被Diff1糾纏,3個(gè)loop是完全不同的3組操作,無法提煉。

    比如,如果現(xiàn)在想要按照奇數(shù)循環(huán),只能依次改動(dòng)三個(gè)循環(huán)。?

    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]?
    + ? ' ? '
    }


    下面我們看看閉包的強(qiáng)大之處,Comm1和Comm2都被很好的封裝在了loop方法里;Diff1則作為參數(shù)(閉包)傳入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?
    +?'?'?}
    }
    如果我們想要改變循環(huán)的方式,只需要改一處
    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?
    '?'
    }

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

    FeedBack:
    # re: Groovy Closure “操作”也成了參數(shù)[未登錄]
    2008-11-07 20:11 | 咖啡
    這個(gè)很熟悉. 好像有其他哪個(gè)語言類似的.   回復(fù)  更多評論
      
    # re: Groovy Closure “操作”也成了參數(shù)
    2008-11-07 21:37 | Jcat
    很多動(dòng)態(tài)語言都有,如Ruby。Groovy正是借鑒了其它動(dòng)態(tài)語言,將閉包引入了Java。另外,現(xiàn)在也正在討論,是否要在JDK7中加入閉包。  回復(fù)  更多評論
      
    主站蜘蛛池模板: 免费观看无遮挡www的小视频| 国产精品亚洲色图| 一级毛片免费毛片一级毛片免费 | 国产精品无码亚洲精品2021| 91香蕉视频免费| 亚洲偷自拍另类图片二区| 美女内射毛片在线看免费人动物| 亚洲成AV人片久久| 色se01短视频永久免费| 亚洲人成电影网站久久| 成在人线AV无码免费| 亚洲丁香婷婷综合久久| 免费又黄又爽的视频| 一区二区视频在线免费观看| 亚洲午夜久久久影院伊人| 97人妻精品全国免费视频| 中文字幕亚洲综合精品一区| 57PAO成人国产永久免费视频 | 亚洲欧洲国产成人综合在线观看 | 美女在线视频观看影院免费天天看 | 国产成人免费高清在线观看| 国产成人亚洲综合在线| 亚洲色成人WWW永久网站| 91久久精品国产免费一区| 亚洲AV男人的天堂在线观看| 亚洲AV日韩精品一区二区三区| 99久久成人国产精品免费| 久久久亚洲欧洲日产国码aⅴ| 青青久在线视频免费观看| 西西人体大胆免费视频| 亚洲av无码精品网站| 成人免费午夜视频| 国产精品综合专区中文字幕免费播放 | 最近中文字幕mv手机免费高清| 国产亚洲美女精品久久久久| 国产亚洲情侣一区二区无| 精品无码免费专区毛片| 美女被免费网站视频在线| 一区二区三区亚洲| 亚洲AV永久无码精品一区二区国产 | 亚洲日韩乱码中文无码蜜桃臀网站|