Groovy闭包

文章详细介绍了Groovy语言中的闭包,包括闭包的定义、作用以及如何作为参数传递。文中通过示例展示了闭包如何打印输出、处理参数、内置变量如this、owner和delegate的用法,并探讨了闭包的委托策略。此外,还提到了闭包在循环、字符串操作和对象方法中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文链接:https://blog.youkuaiyun.com/feather_wch/article/details/131618022

/***===============================
 * 闭包
 * 1、闭包是什么?匿名内联函数,也称为闭包
 * 2、闭包是函数内部和外部的桥梁
 *
 * 闭包一般不会直接使用,而是作为参数传入
 * 闭包具有的关键变量:
 *  1. this
 *  2. owner
 *  3. delegate
 *  4. 闭包的委托策略
 *=================================*/

def closure={
    println("hello")
}
closure() // 方法1
closure.call()

// 参数闭包
def closeureParam={String name, int age->
    println("name:$name:age:$age")
}
closeureParam.call("wch", 20)

// 内置参数 it
def closureIt={
    println "hello it=$it"
    return it
}
closureIt.call("wch")
// 返回值
def result = closureIt.call("feather")
println(result)

// 基本数据类型API 1.upto(n, xxx) 1~n
int n1 = fab(3)
int fab(int number){
    int result = 1;
    1.upto(number, { num-> result *= num})
    return result
}
println(n1)

// 基本数据类型API n.downto(1, xxx) n~1
int fab2(int n){
    int result = 1
    n.downto(1){
        result *= it
    }
    return result
}
int n2 = fab2(5)
println(n2)

// 基本数据类型API 5.times 1,2,3,4  < size(5)
int sum(int n){
    int result = 0
    n.times {
        result += it
    }
    return result
}
println(sum(5))

// String each
String strEach = "math: 2 + 3 = 5"
strEach.each { s->
    if(s.isNumber())println(s)
    // 每个字符复重复2个
    s.multiply(2)
}

// String find查找符合条件的第一个字符
println strEach.find{
    it.isNumber()
}
// String findAll 符合的所有字符
def list = strEach.findAll{
    it.isNumber()
}
println(list.toListString())

// String any 查找是否有符合条件的字符
def resultAny = strEach.any {
    it.isNumber()
}
println(resultAny)

// every 是否所有的字符都符合条件
def resultEvery = strEach.every {
    it.isNumber()
}
println(resultEvery)

// collect 所有的东西都操作, 比如都转化为大写
def listCollection = strEach.collect{
    it.toUpperCase()
}
println(listCollection.toListString())

def scriptClosure = {
    println(this) // 闭包定义处的类
    println(owner) // 闭包定义处的类或者对象
    println(delegate) // 任意对象,默认是owner指向的对象
}
scriptClosure.call() // 没有任何区别,在普通类或者对象中也没有任何区别

// 多用于架构设计
def nestClosure = {
    def innerClosure = {
        println("innerClosure=====================")
        println(this) // innerClosure对象
        println(owner) // nestClosure对象
        println(delegate) // nestClosure对象
    }
    innerClosure.call()
}
nestClosure.call()

HelloWorld h = new HelloWorld()
def nestClosureD = {
    def innerClosureD = {
        println("修改delegate=====================")
        println(this) // innerClosureD对象
        println(owner) // nestClosureD对象
        println(delegate) // HelloWorld对象
    }
    innerClosureD.delegate = h // 修改delegate
    innerClosureD.call()
}
nestClosureD.call()

/***
 * 闭包的委托策略
 */
class Student{
    String name
    def desc = {"My name is $name"}
    String toString(){
        desc.call()
    }
}
def student = new Student(name:"wch") // 指定参数,进行构造
println student.toString()

class Teacher{
    String name
}
def teacher = new Teacher(name:"derry")
student.desc.delegate = teacher // 代理,是否生效取决于委托策略
student.desc.resolveStrategy = groovy.lang.Closure.DELEGATE_FIRST // 委托策略

println student.toString()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猎羽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值