Groovy语法之闭包

本文深入探讨Groovy的闭包概念,包括闭包的定义、格式、执行方式,以及代理策略中的this、owner和delegate的含义和区别。通过示例解释了不同代理策略对闭包行为的影响,强调了闭包在Groovy中的重要性和灵活性。
摘要由CSDN通过智能技术生成
闭包概述

闭包就是一个特殊的匿名代码块,可以传递参数,有返回值,还能作为方法的参数进行传递。

闭包格式
  1. 闭包的格式定义如下:

    { [closureParameters -> ] statements }

    示例:

    { item++ }                                          
    
    { -> item++ }                                       
    
    { println it }                                      
    
    { it -> println it }                                
    
    { name -> println name }                            
    
    { String x, int y ->                                
        println "hey ${x} the value is ${y}"
    }
    
    { reader ->                                         
        def line = reader.readLine()
        line.trim()
    }
  2. closureParameters :闭包参数是非必需的,与方法的参数十分类似,区别是:如果存在闭包参数,闭包参数与闭包语句之间需要使用箭头(->)的分割。

  3. 注意:如果没有指定参数,则默认存在一个it的参数,代表的是闭包本身。如下例子:

    def obj = {
        println(it)
    }
    obj('hello')
  4. statements:同样,闭包语句则可以类比于方法体,功能也相同。

  5. 变量可作为闭包的载体,原因是:闭包其实是Groovy中的Closure类的实例。如下三种示例:

    def listener = { e -> println "Clicked on $e.source" }      
    
    //指明为Closure类型实例
    Closure callback = { println 'Done!' }                      
    
    //指明为Closure类型实例,并指定返回类型 
    Closure<Boolean> isTextFile = {
        File it -> it.name.endsWith('.txt')                     
    }
  6. 执行闭包有两种方式:一是直接调用;二是通过调用Closure的call方法。如下代码:

    def obj = {
        def item = 10
        return ++item
    }
    // 直接调用
    println(obj())
    
    //call调用
    println(obj.call())
  7. 从字节码来看上述两种方式的区别:两种方式完全等效,都是通过call来完成

    public Object test() {
        CallSite[] var1 = $getCallSiteArray();
        class _test_closure1 extends
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值