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")

          ????????
          /*
          ????????通常,操作是死的,我們能動態代入的是“數據”。
          ????????閉包使得我們可以動態的代入一段“操作”。
          ????????“閉包是可以用作方法參數的代碼塊。”
          ?????????
          */
          ????????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 閱讀(356) 評論(0)  編輯  收藏 所屬分類: Java
          主站蜘蛛池模板: 界首市| 平凉市| 昌平区| 邓州市| 海林市| 巫溪县| 寻甸| 陆良县| 镇远县| 横峰县| 天峨县| 临沭县| 嘉兴市| 得荣县| 永康市| 中西区| 丰顺县| 泊头市| 浪卡子县| 富锦市| 宜良县| 西青区| 建始县| 潼关县| 长海县| 南平市| 阆中市| 桓仁| 综艺| 高邑县| 南汇区| 民权县| 兴义市| 庄浪县| 余庆县| 长丰县| 宁海县| 敖汉旗| 五家渠市| 中西区| 长沙市|