Gradle理论与实践二:Groovy介绍

小编 2026-07-14 阅读:170 评论:0
Groovy介绍 Groovy是基于JVM虚拟机的一种动态语言,语法和Java非常相似,Groovy代码在执行时同样编译成Class字节码在JVM上执行,可以认为Groovy扩展了Java语言...

Groovy介绍

Groovy是基于JVM虚拟机的一种动态语言,语法和Java非常相似,Groovy代码在执行时同样编译成Class字节码在JVM上执行,可以认为Groovy扩展了Java语言。除此之外,Groovy还支持闭包、支持DSL(Domain Specific Lauguage 领域特定语言),是一门非常灵活的脚本语言。

Groovy、Java、JVM之间的关系:

\"groovy.png\"

Groovy的一些特点:

  • Groovy语句可以不用分号结尾;
  • Groovy使用def关键字定义变量(def不是必须的,但建议不要省略),定义变量的时候可以不指定其类型;同样Groovy定义函数时,参数也可以不指定类型;
  • Groovy除了变量和函数中的参数可以不指定类型,函数中如果有返回值,可以省略return,函数中最后一句代码执行结果即是返回值。

1、字符串处理

在Java中,双引号代表一个字符串,单引号代表是字符;在Groovy中,单引号和双引号都可以定义一个字符串常量,但是单引号和双引号也是有区别的,如下:

vatask hello {
    def name = \"beijing\"
    doLast {
       print \"双引号:name is ${name}\\n\"
       print \'双引号:name is ${name}\'
    }
}

结果:

bogon:test_gradle mq$ gradle -q hello
双引号:name is beijing
双引号:name is ${name}

从输出结果可以得出结论:单引号是不具备运算能力的,所有表达式都被认为是字符串;而双引号可以通过${}表达式放入变量或者进行表达式计算。

2、集合的声明与操作

List

对应Java中的List接口,其实现类是ArrayLIst.

  • 定义List:
def myList = [1, 2, 3, 4, 5]

myList的类型是java.util.ArrayList

  • List取值:
print numList[0]//访问第一个元素 结果为1
print numList[1]//访问第二个元素 结果为2
print numList[-1]//访问倒数第一个元素 结果为5
print numList[1..3]//访问第二个到第四个元素 结果为[2,3,4]

可见在Groovy中索引值不仅可以是正的,还可以是负的,表示从右往左数;还可以是一个范围索引(如1…3);如果索引越界,返回Null。

  • 遍历List
    使用List.each即可遍历LIst,如:
task hello << {
     def numList = [1, 2, 3, 4, 5]

     numList.each {
        print it
      }
}

Map

  • 定义Map、Map取值、遍历Map
  //定义Map 以K-V形式保存 其中country、city为Key值,china、beijing为value
  def myMap = [\'country\': \'china\', \'city\': \'beijing\']

  //下面两种方式都可以获取到key对应的value
  print myMap.country //结果为china
  print myMap[\'country\'] //结果为china

  //map迭代也是用each方法,迭代的元素是一个Map.Entry
  myMap.each {
      print \"Key:${it.key},value:${it.value}\"
  }

3、方法

  • 方法的括号是可以省略的,如下:
static def mMethod(int a, int b) {
    return a + b
}

task hello << {
    //下面两种方式结果是一样的
    mMethod(2, 3)
    mMethod 2, 3
}

mMethod中的return也是可以省略的,当没有return时,Groovy会把方法执行过程中的最后一句代码作为其返回值。

  • 代码块(闭包closure)可以作为参数传递

**被{}包围起来的代码被称为代码块。**Groovy允许一个代码块可以作为参数传递到方法里的,如下面三种方式:

task hello << {
     def myList = [1, 2, 3, 4, 5]
     
     //第一种:方法中传入代码块{}
     myList.each({ print it })

     //第二种:Groovy规定,如果方法最后一个参数是闭包,可以放到方法外面
     myList.each() { print it }

     //第三种:方法括号可以省略,就变成我们最常见的形式了
     myList.each {
         print it
     }
}

4、闭包

闭包(Closure)是一种数据类型,通俗来说就是一段可执行的代码块。来自定义一个闭包:

//定义一个闭包
static def customClosure(closure) {
    def myMap = [\'name\': \'mq\', \'country\': \'china\']
    myMap.each {
         //闭包中有两个参数
        closure(it.key, it.value)
    }
}

task hello << {
    customClosure {
        //声明多个参数 对应闭包中的key和value
        k, v ->
            print \"${k} is ${v}\\n\"
    }
}

当闭包中有一个参数时,默认就是it;当有多个参数时,就不能用it了,需要声明多个参数。如用 (k,v) 声明闭包中的两个参数, ->操作符用于把闭包的参数和主体区分开。

版权声明

本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。

热门文章
  • Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering

    Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering
    Problem Statement 我们考虑一个具有马尔可夫性质、非线性、非高斯的状态空间模型(State Space Model):对于一个时间序列上的观测结果{yt,t∈N}\\{ y_t , t \\in N \\}{yt​,t∈N},我们认为每个观测结果yty_tyt​的生成依赖于一个无法直接观察的隐变量xt∈{xt,t∈N}x_t \\in \\{x_t , t \\in N \\}xt​∈{xt​,t∈N},即:p(...
  • 机房智能化温湿度解决方式之POE供电以太网温湿度传感器

    机房智能化温湿度解决方式之POE供电以太网温湿度传感器
    机房智能化温湿度解决方式之POE供电以太网温湿度传感器 北京盈创力和电子科技有限公司 智能型TCP网口温湿度记录仪 北京IP网络温湿度记录仪厂家,北京盈创力和 北京智能型TCP网口温湿度记录仪IP网络温湿度记录仪是一种新型的基于TCP/IP协议双绞线以太网标准温湿度采集模块,利用它可以实现现场温度值、相对湿度值的采集,同时利用其自身的RJ45通信接口可以方便地和机房监控主机或交换机集线器进行联网。 工作于-40℃~85℃工业级带...
  • Hive 系统函数及示例

    Hive 系统函数及示例
    查看所有系统函数 show functions; 函数分类 内置函数【系统函数】 数学函数: floor、round、ceil、cos、log2等 字符串函数: length、reverse、trim、lower、get_json_object、repeat等 收集函数: size 转换函数: cast 日期函数: year、month、datediff、date、date_add等 条件函数: coalesce、case…w...
  • CSRF的原理和防范措施

    CSRF的原理和防范措施
    a)攻击原理:i.用户C访问正常网站A时进行登录,浏览器保存A的cookieii.用户C再访问攻击网站B,网站B上有某个隐藏的链接或者图片标签会自动请求网站A的URL地址,例如表单提交,传指定的参数iii.而攻击网站B在访问网站A的时候,浏览器会自动带上网站A的cookieiv.所以网站A在接收到请求之后可判断当前用户是登录状态,所以...
  • HTTP状态保持的原理

    HTTP状态保持的原理
    a)在用户登录之后,浏览器返回响应的时候会在响应中添加上cookieb)浏览器接收到cookie之后会自动保存c)当用户再次请求同一服务器中的其他网页的时候,浏览器会自动带上之前保存的cookied)服务接收到请求之后可以请 request 对象中取到cookie 判断当前用户是否登录  Http是无状态的,就是连接时数据互通,关闭后...
标签列表