一、闭包
定义:匿名内联函数,也称为闭包。(闭包常被当做另外一个函数的参数传入进去)
本质上,闭包是把函数内部和函数外部连接起来的桥梁。
二、闭包的简单使用
1.无参的闭包调用
def closure={
println "hellow groovy!"
}
closure()
closure.call()
2.有参的闭包调用
def closure = {String name,int age->
println "name:${name} age:${age}"
}
closure("aaa",18)
closure.call("aa",18)
3.内置参数
def closure={
println "hellow ${it}!"
}
closure("aaa")
closure.call("aaa")
4.闭包的返回值
def closure={
println "hellow ${it}!"
return "123456"
}
def res = closure("aaa")
println "res:="+res
三、闭包当作参数进行传递
打印结果是:120
upto():从1到5递增执行result * num
写法1.
int x = fab(5)
int fab(int number){
int result = 1;
1.upto(number,{num->result *= num})
return result
}
println x;
写法2
int x = fab(5)
int fab(int number){
int result = 1;
1.upto(number){
num->result *= num
}
return result
}
println x;
四、和String相关的API
1.字符串的遍历each
String str = "2 and 3 is 5"
str.each{
String s -> print s
}
2.查找符合条件的第一个字符find
结果:2
String str = "2 and 3 is 5"
println str.find{
String s -> s.isNumber()
}
3.查找符合条件的所有字符 findAll
结果:[2,3,5]
String str = "2 and 3 is 5"
def list = str.findAll{
String s -> s.isNumber()
}
println list.toListString()
4.查找是否存在符合条件的字符any
结果:true
String str = "2 and 3 is 5"
println str.any{
String s -> s.isNumber()
}
5.检查字符串是否都符合条件 every
结果:false
String str = "2 and 3 is 5"
println str.every{
String s -> s.isNumber()
}
5.对String的每一位单独操作的结果保存在一个集合中collect
结果:[2, ,A,N,D, ,3, ,I,S, ,5]
String str = "2 and 3 is 5"
def list = str.collect{
it.toUpperCase()
}
println list.toListString()
五、关键变量 this、owner、delegate
this:代表闭包定义处的类。
owner:是最外面的类或者闭包
delehate:可以代表任意对象(手动赋值),默认跟owner相同
1.同一个闭包中这三个变量相同
def classClouser= {
println this
println owner
println delegate
}
2.在方法中调用闭包
结果:打印的都是Person对象。
class Person{
def classClouser= {
println this
println owner
println delegate
}
classClouser()
def static method(){
def classClouser= {
println this
println owner
println delegate
}
classClouser()
}
}
Person.classClouser()
Person.method()
3.闭包里的闭包
结果:this是内部对象其它的是外部对象。
def nextClouser = {
def inner = {
println this
println owner
println delegate
}
inner()
}
nextClouser()
4.如何使delegate与owner不同
Person p = new Person()
def nextClouser = {
def inner = {
println this
println owner
println delegate
}
inner.delegate = p
inner()
}
nextClouser()
六、闭包的委托策略
如果不加入闭包委托策略打印的使aa
加了就成了bb
calss Student{
String name
def pretty = {"name is ${name}"}
String toString(){
pretty()
}
}
def student = new Student(name:'aa')
calss Teacher{
String name
}
def teacher = new Teacher(name:'bb')
student.pretty.delegate = teacher
//闭包委托策略
student.pretty.resolveStrategy = Closure.DELEGATE_FIRST
println student.toString()