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

          Definition

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


          Using

          package?jcat.bit

          class?Test?{
          ????
          /*
          ????1.?閉包是對象,是Closure類的實例,所以:
          ????????1)可以在類里定義Closure類型的屬性
          ????????2)可以在方法里定義Closure類型的變量
          ????????3)可以定義一個方法,接收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對閉包的一個隱藏方法。
          ?????????
          */
          ????????PRINT_STR(
          "像方法一樣調(diào)用")
          ????????PRINT_STR.call(
          "作為Closure的實例,再調(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)
          ????????}
          ????}
          }



          -----------------------------------------------------------------
          附上一個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 閱讀(363) 評論(0)  編輯  收藏 所屬分類: Java
          主站蜘蛛池模板: 鲁山县| 稻城县| 德州市| 毕节市| 河曲县| 太白县| 庆安县| 仁寿县| 仙居县| 花垣县| 青海省| 克什克腾旗| 墨脱县| 南靖县| 大冶市| 汉源县| 明星| 左权县| 漳浦县| 晋中市| 石楼县| 仙桃市| 绥宁县| 大同市| 孝义市| 自贡市| 临沭县| 乌拉特前旗| 清水河县| 商南县| 海门市| 华亭县| 江安县| 河北区| 绥滨县| 来宾市| 丰宁| 扎鲁特旗| 铜山县| 拜泉县| 浦江县|