美文网首页
Gradle学习(1) —— Groovy语言学习

Gradle学习(1) —— Groovy语言学习

作者: 菜鸟超 | 来源:发表于2018-11-15 14:41 被阅读0次

    Gradle学习(1) —— Groovy语言学习

    《论语.魏灵公》:"工欲善其事,必先利其器。" Gradle作为主流Android开发IDE-AndroidStduio 的构建工具,也是我们Android工程师需要了解一门知识。 在认识Gradle之前,我们先来认识Gradle的语言Groovy.

    一、前言

    AndroidStudio之前,我们常用的构建工具有AntMavenAnt是之前java最流行的构建工具,Maven第一次支持了网络下载功能,专注于库的依赖。但是他们都是用XML作为配置文件格式,很难实现差异项目的构建。而Gradle的特点就是它是一种DSL,即Domain Specific Language,领域相关语言。也就是行话。行话要求在这个行业里的人一听就懂,一看就明白,不需要解释。这也正是Gradle 选择Groovy的原因。据说Gradle后续还会支持更多的语言

    二、认识Groovy

    Groovy基于Java并扩展了Java。Java程序员可以无缝切换到使用Groovy开发程序。在Groovy脚本运行时,groovy会先将其编译成javaclass,然后通过jvm运行。
    在Groovy中除了可以直接使用的JDK 外,还有自己的一套
    GDK,如果需要可以去查阅。

    2.1基本认识

    2.1.1 注释

    //像JAVA一样
    /*像JAVA一样*/
    

    2.1.2 Groovy语句可以不以分号结尾

    2.1.3 支持动态类型

    def value1=1
    def str="abc"
    def String str="def"
    def int i=0
    

    2.1.4 函数无需指定参数类型

    String getVersionName(countryCode,province){
        "中国"+"广东" //最后一行代码执行结果就是本函数的返回值
                      //也可以使用return
    }
    
    int getVersionCode(){
        return 1000
    }
    
    

    2.1.5 无类型函数定义,使用def关键字

    def doSomeThing(){
       ...
       //最后一行可以返回,相当于Object
    }
    

    2.1.6 字符串操作

    //单引号''保持java中String的原意,不转义
    def singleQueteStr='I have $a apple' //输出就是I have $a apple
    
    //双引号""类似于kotlin中对字符串的处理
    def doubleQueteStr="I have an apple" //输出就是I have an apple
    
    //双引号夹带变量
    def a = 1
    def str="I hava $a apple" //输出是I have 1 apple
    
    //三引号如:'''aaaa'''中字符串支持随意换行
    def mutilines = '''I have one apple,
    I have two apple,
    I have three apple。
    '''
    

    2.1.7 函数调用

    groovy中除了代码中不需要加分号外,函数调用还可以不加括号,比如:

    println("test")
    println "test"
    

    不过这样子使用,有时候groovy会把属性和函数调用混淆。
    (这里需要一张测试图片)

    2.2 数据类型

    Groovy是java 的扩展,java的基本数据类型在Groovy中都有,但是Grooovy也拥有属于自己的数据类型,总得说Groovy的数据类型可以分为三种

    • JAVA基本数据类型
    • Groovy容器类
    • 闭包

    在这里主要为大家介绍与java不一样的两种

    2.2.1 容器类

    Groovy 中的容器就三种,List,Map,Range

    • List :链表
    • Map :键值
    • Range :范围,List的一种扩展
    2.2.1.1 List 链表
    //定义一个List,它的元素可以是任何对象
    def list = [1,"str",true]
    
    //变量存取,可以直接通过索引存取,不用担心索引越界。
    //如果索引超过链表长度,Groovy会自动向该链表添加元素
    
    list[100]=100 // 当前链表的长度是101
    
    
    2.2.1.2 Map 键-值
    //定义一个Map,跟java不同的是,map的键必须是字符串,值可以是任何类型
    def map=['key1':'value1','key2':1]
    //另外key可以也可以不被 '',"" 包起来,Groovy默认会把Key处理成字符串
    //例如
    def map=[key1:1,key2:"string"]
    //当然,如果不把key包起来,可能会导致混淆
    //例如
    def key1="aaa"
    def map2=[key1:"str"] //这样就不知道key1到底是 "aaa" ,还是 "key1" 了
    
    //在groovy中取值也更加方便了
    map.keyname
    map['keyName'] 
    
    map.another = "mapValue"  //添加元素
    
    
    2.2.1.3 Range 类
    //定义一个Range
    def mRange = 1..25  //1-25的范围
    //或者
    def bRange = 1..<25  //1-24的范围
    
    bRange.containsWithinBounds(2) == true //这样判断一个数字是否在bRange的范围内
    
    bRange.form //最低值
    
    bRange.to   //最高值
    
    

    2.2.2 闭包

    闭包(Closure),是Groovy中非常重要的一个数据类型或者说一种概念。它代表了一段可执行代码。

    2.2.2.1 认识闭包
    def mClosure= {
        String param1, int param2 ->  //这个箭头很关键。箭头前面是参数定义,箭头后面是代码  
        println "this is code" //这是代码,最后一句是返回值,  
        //也可以使用return,和Groovy中普通函数一样  
    }
    

    2.2.2.1.1 闭包的定义格式
    def xxx = {无参数,纯code}  //这种情况不需要->符号
    
    def ccc = {参数->代码逻辑}  
    

    2.2.2.1.2 调用格式

    闭包对象.call(参数)

    闭包对象(参数)

    xxx.call("aaa",1111)
    xxx("aaa",1111)
    

    特别需要注意的一点,如果闭包没定义参数的话,则隐含有一个参数,这个参数名字叫 it ,和this的作用类似。 it 代表闭包的参数。

    //比如:  
    
    def greeting = { "Hello, $it!" }  
    assert greeting('Patrick') == 'Hello, Patrick!'  
    
    //等同于:  
    
    def greeting = { it -> "Hello, $it!"}  
    assert greeting('Patrick') == 'Hello, Patrick!'  
    
    //但是,如果在闭包定义时,采用下面这种写法,则表示闭包没有参数!  
    
    def noParamClosure = { -> true }  
    
    //这个时候,我们就不能给noParamClosure传参数了!  
    
    noParamClosure ("test")  //会报错喔!  
    
    2.2.2.1.3 闭包使用时省略圆括号
    public static <T> List<T>each(List<T> self, Closure closure)  
    //上面这个函数表示针对List的每一个元素都会调用closure做一些处理。这里的closure,就有点回调函数的感觉。但是,在使用这个each函数的时候,我们传递一个怎样的Closure进去呢?比如:  
    def iamList = [1,2,3,4,5]  //定义一个List  
    iamList.each{ //调用它的each,这段代码的格式看不懂了吧?each是个函数,圆括号去哪了?  
          println it  
    }  
    //each函数调用的圆括号不见了!原来,Groovy中,当函数的最后一个参数是闭包的话,可以省略圆括号。比如  
    def testClosure(int a1,String b1, Closure closure){  
          //dosomething  
         closure() //调用闭包  
    }  
    //那么调用的时候,就可以免括号!  
    testClosure (4, "test", {  
       println "i am in closure"  
    } ) 
    

    ==这种用法我是拒绝的 = =!,我不知道你们你怎么想的==

    比如说像项目里面的build.gradle中,完全看不懂是什么意思啊,就会以为花括号里面的代码在调用release时立即会被调用一样。素不知它还会被处理

    [图片上传失败...(image-ec9acc-1542263977880)]

    还有一个就是,作为类似于回调这种东西,该怎么知道调用者传递什么参数给Closure呢?

    回答:查 API 文档

    总结:Groovy的坑还有很多,闭包(Closure)的坑更多,不过这个并不影响我们现在对Gradle的学习

    相关文章

      网友评论

          本文标题:Gradle学习(1) —— Groovy语言学习

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