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 阅读(346)
评论(0) 编辑 收藏 所属分类:
Java