groovy闭包

409 阅读2分钟

一、闭包

定义:匿名内联函数,也称为闭包。(闭包常被当做另外一个函数的参数传入进去)

本质上,闭包是把函数内部和函数外部连接起来的桥梁

二、闭包的简单使用

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