美文网首页
Gradle理论与实践二:Groovy介绍

Gradle理论与实践二:Groovy介绍

作者: 饱醉豚我去年买了个表 | 来源:发表于2018-12-28 14:24 被阅读12次

    Gradle系列相关文章
    1、Gradle理论与实践一:Gradle入门
    2、Gradle理论与实践二:Groovy介绍
    3、Gradle理论与实践三:Gradle构建脚本基础
    4、Gradle理论与实践四:自定义Gradle插件
    5、Gradle配置subprojects和allprojects的区别:subprojects和allprojects的区别

    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) 声明闭包中的两个参数, ->操作符用于把闭包的参数和主体区分开。

    相关文章

      网友评论

          本文标题:Gradle理论与实践二:Groovy介绍

          本文链接:https://www.haomeiwen.com/subject/tywslqtx.html