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