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

          Definition

          ??? /*
          ????????1.?變量是用來裝“數據”的,閉包就是用來裝“操作”的
          ????????2.?和定義一個方法一樣,閉包也可以有入參
          ???????
          */
          ????????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是默認的參數名字,所以這里連入參的定義都省了
          ????????????print?it? + ? ' ? '
          ????????}


          Using

          package?jcat.bit

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

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


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


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

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

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



          -----------------------------------------------------------------
          附上一個Java的匿名內部類的例子,用來和閉包對比一下。
          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 閱讀(363) 評論(0)  編輯  收藏 所屬分類: Java
          主站蜘蛛池模板: 静乐县| 吉木萨尔县| 礼泉县| 鄂尔多斯市| 浦县| 长兴县| 南安市| 荔波县| 新余市| 绥阳县| 山丹县| 定西市| 正蓝旗| 灵宝市| 昭平县| 库尔勒市| 白山市| 淳安县| 凤山县| 遂平县| 寻乌县| 泰顺县| 屏东市| 丘北县| 怀化市| 洪洞县| 白河县| 寿光市| 宁蒗| 宝应县| 盐池县| 南昌县| 涪陵区| 山西省| 泰顺县| 鄢陵县| 秭归县| 墨脱县| 乌审旗| 屯留县| 滦南县|