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

          Definition

          ??? /*
          ????????1.?變量是用來裝“數(shù)據(jù)”的,閉包就是用來裝“操作”的
          ????????2.?和定義一個(gè)方法一樣,閉包也可以有入?yún)?br />???????
          */
          ????????Closure?p?
          = ?{x? ->
          ????????????print?x?
          + ? ' ? '
          ????????}
          ????????[
          1 ,? 2 ,? 3 ].each(p)

          ????????[
          4 ,? 5 ,? 6 ].each({x? -> ? // ?閉包是可以匿名的
          ????????????print?x? + ? ' ? '
          ????????})

          ????????[
          7 ,? 8 ,? 9 ].each?{x? -> ? // ?括號是可以省略的
          ????????????print?x? + ? ' ? '
          ????????}

          ????????[
          10 ,? 11 ,? 12 ].each?{? // ?it是默認(rèn)的參數(shù)名字,所以這里連入?yún)⒌亩x都省了
          ????????????print?it? + ? ' ? '
          ????????}


          Using

          package?jcat.bit

          class?Test?{
          ????
          /*
          ????1.?閉包是對象,是Closure類的實(shí)例,所以:
          ????????1)可以在類里定義Closure類型的屬性
          ????????2)可以在方法里定義Closure類型的變量
          ????????3)可以定義一個(gè)方法,接收Closure類型的參數(shù)
          ????2.?閉包又有方法特質(zhì),畢竟它裝的是“操作”,甚至可以像調(diào)用方法一樣調(diào)用閉包
          ?????
          */

          ????
          static?final?Closure?PRINT_STR?=?{??//?屬性(類變量)
          ????????println?it
          ????}


          ????
          static?void?main(String[]?a)?{
          ????????
          /*
          ????????閉包類似Java的內(nèi)部類,區(qū)別是閉包只有單一的方法可以調(diào)用,但可以有任意的參數(shù),
          ????????閉包用“{}”括起,“->”前面是參數(shù),后面是處理語句,可以直接調(diào)用,也可以使
          ????????用call調(diào)用。不管那種調(diào)用,最后groovy編譯器都會把編譯成對doCall方法的調(diào)用,
          ????????這是groovy對閉包的一個(gè)隱藏方法。
          ?????????
          */
          ????????PRINT_STR(
          "像方法一樣調(diào)用")
          ????????PRINT_STR.call(
          "作為Closure的實(shí)例,再調(diào)用相應(yīng)的方法")


          ????????Closure?printLength?
          =?{String?s?->??//?局部變量
          ????????????println?s.length()
          ????????}
          ????????printLength(
          "AAA")

          ????????
          /*
          ????????通常,操作是死的,我們能動態(tài)代入的是“數(shù)據(jù)”。
          ????????閉包使得我們可以動態(tài)的代入一段“操作”。
          ????????“閉包是可以用作方法參數(shù)的代碼塊。”
          ?????????
          */
          ????????closureAsParameter(
          null,?printLength)
          ????????closureAsParameter(
          "BBB",?PRINT_STR)
          ????}

          ????
          static?void?closureAsParameter(String?s,?Closure?c)?{
          ????????
          if?(s?!=?null)?{
          ????????????c.call(s)
          ????????}
          ????}
          }



          -----------------------------------------------------------------
          附上一個(gè)Java的匿名內(nèi)部類的例子,用來和閉包對比一下。
          package?jcat.bit;

          public?class?AnonymousInnerClass?{
          ????
          public?static?void?main(String[]?args)?{
          ????????AbsClass?a?
          =?new?AbsClass()?{
          ????????????
          public?void?foo(String?s)?{
          ????????????????System.out.println(s);
          ????????????}
          ????????};

          ????????a.foo(
          "ABC");

          ????????AbsClass?b?
          =?new?AbsClass()?{
          ????????????
          public?void?foo(String?s)?{
          ????????????????System.out.println(s.length());
          ????????????}
          ????????};
          ????????b.foo(
          "ABC");
          ????}
          }

          abstract?class?AbsClass?{
          ????
          public?abstract?void?foo(String?s);
          }
          posted on 2008-11-06 18:50 Jcat 閱讀(356) 評論(0)  編輯  收藏 所屬分類: Java
          主站蜘蛛池模板: 咸丰县| 广安市| 泊头市| 武夷山市| 高碑店市| 驻马店市| 正宁县| 清原| 德昌县| 高台县| 高清| 巩留县| 苍溪县| 定南县| 蒙城县| 澳门| 吉安县| 唐河县| 衡水市| 深圳市| 寿宁县| 荔波县| 右玉县| 邵阳县| 陇川县| 哈密市| 桦甸市| 绥芬河市| 时尚| 上栗县| 修水县| 华容县| 墨竹工卡县| 新野县| 崇左市| 灌阳县| 上蔡县| 鹤岗市| 祁连县| 壤塘县| 双城市|