Groovy探索之闭包 三
我们知道,Groovy语言是建立在JVM的基础上的,我们在使用Groovy语言的时候,就迫切希望我们Groovy程序能够运用自如的使用以前的Java API或者以前Java代码的积累。
在JDK中,对内部类的使用是很多的,但Groovy语言是不支持内部类的,我们该怎么办呢?
请看下面的例子:
public
class
Person {
private
String
name
;
private
int
age
;
public
Person(String name,
int
age)
{
this
.
name
= name;
this
.
age
= age;
}
public
int
getAge() {
return
age
;
}
public
void
setAge(
int
age) {
this
.
age
= age;
}
public
String getName() {
return
name
;
}
public
void
setName(String name) {
this
.
name
= name;
}
}
List list =
new
ArrayList();
Person p1 =
new
Person(
"Tom"
,23);
list.add(p1);
Person p2 =
new
Person(
"Alice"
,18);
list.add(p2);
Person p3 =
new
Person(
"Wallam"
,31);
list.add(p3);
Person p4 =
new
Person(
"Rose"
,25);
list.add(p4);
public
int
compare(Object node1,Object node2) {
return
((Person)node1).getAge()-((Person)node2).getAge();
}
});
下面我们来测试排序后的
list
对象:
for
(
int
i=0;i<list.size();i++)
{
}
结果为:
Alice
Tom
Rose
Wallam
new
Comparator(){
public
int
compare(Object node1,Object node2) {
return
((Person)node1).getAge()-((Person)node2).getAge();
}
}
是的,闭包!
先来看我们的
Domain
对象:
class
Person
{
String name
int
age
}
def
list = [
new
Person(name:
'Tom'
,age:
23
),
new
Person(name:
'Alice'
,age:
18
),
new
Person(name:
'Wallam'
,age:
31
),
new
Person(name:
'Rose'
,age:
25
)]
node1,node2 ->
node1.age-node2.age
下面,我们来使用这个接口的实现:
这就完成了排序的过程,最后我们来看看排序的结果:
list.
each
{
println
it.name
}
打印结果为:
Alice
Tom
Rose
Wallam
这样的解决方案在你在
Groovy
语言中使用
Java api
的时候会经常碰到,特别是你是使用
Swing
或其他
API
做
GUI
编程的时候,更是会经常碰到。在这样的时刻,别忘了使用闭包来代替匿名内部类。
下面我们来看看一个例子:
interface
Test
{
def
test
()
}
如果我们使用闭包来实现上面的接口,那么该怎么做呢?
def
test
= {
println
'ok'
}
as
Test
test
.
test
()
运行结果为:
ok
看到这里,你肯定会问,如果接口里面有多个方法,该怎么使用闭包来实现接口呢?
请看下面的例子:
interface
MultiFuncTest
{
def
test1()
def
test2(str)
}
def
impl = [test1:{
println
'test'
},
test2:{str ->
println
str}]
as
MultiFuncTest
可以看到,这样的实现也是非常简单方便的。
下面来测试一下:
impl.test1()
impl.test2(
'ok'
)
运行结果为:
test
ok
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。