Groovy基础语法点

2018-09-12  本文已影响11人  ZenCabin

string类型 “” 和‘’ 的区别

在groovy里,表示string类型,可以使用双引号也可以使用单引号,和java有些区别。
单引号和双引号在groovy里也是有区别的。单引号里表示的是常量字符串,双引号有计算能力,区别如示例:

task printStringVal{
    def name = "哈利路亚"
    
    println "双引号里的变量${name}"
    println '单引号里的变量${name}'
}

输出结果如下:

> Task :printStringVal
双引号里的变量哈利路亚
单引号里的变量${name}

输出list、map

直接看例子

task printList {
    def numList =[1,2,3,4,5]
    
    doLast{
        println numList.getClass().name // 打印对应的类型
        println numList[0]  // 打印第一个元素
        println numList[-1] // 打印最后一个元素
        println numList[4]  // 打印第五个元素
        println numList[1..3] // 打印第二个到第四个元素
        
        numList.each{
            print it + "\t"
        }
    }
}

结果:

> Task :printList
java.util.ArrayList
1
5
5
[2, 3, 4]
1       2       3       4       5

list对应了ArrayList类
再来看map:

task printMap {
    def map1 = ['width':1080, 'height':1920]
    
    doLast {
        println map1.getClass().name
        println "key为width的元素,value为:" + map1['width']
        map1.each{
            println "key:${it.key}, value:${it.value}"
        }
    }
}

map对应了LinkedHashMap
运行结果:

> Configure project :
hello gradle

> Task :printMap
java.util.LinkedHashMap
key为width的元素,value为:1080
key:width, value:1080
key:height, value:1920

方法调用

// 定义一个方法
def method1(int a, int b){
    println a + b
}

// task中调用这个方法,可以不使用括号(),如
method1(1,2)、
method1 1,2
以上两中方式均可,*不过貌似作为参数时,第二种方式不可以

闭包

实现一个类似闭包的功能

task helloClosure{
    doLast{
        customEach{
            println it
        }
    }
}

def customEach(closure){
    // 循环调用10次这个闭包代码块
    for(int i in 1..10){
        closure(i)
    }
}

以上代码类似list中的each闭包功能,方法customEach在task的doLast中被执行,而customEach后的代码块{...}就是customEach的参数closure,这个参数(即代码块{...})在customEach里被放在for循环里迭代10次,这就类似list的each功能的实现。

task helloClosure2{
    doLast{
        eachMap{ k,v ->
            println "${k} : ${v}" 
        }
    }
}

def eachMap(closure){
    def map = ["name":"jason", "age":16]
    map.each{
        closure(it.key, it.value)
    }
}

结果:

task helloClosure2{
    doLast{
        eachMap{ k,v ->
            println "${k} : ${v}" 
        }
    }
}

def eachMap(closure){
    def map = ["name":"jason", "age":16]
    map.each{
        closure(it.key, it.value)
    }
}

闭包委托

Groovy闭包的强大之处在于它支持闭包方法的委托,Groovy中的闭包有thisObject、owner、delegate三个属性。当你在闭包内调用方法时,由它们来决定使用哪个对象来处理。默认情况下,owner和delegate是相等的,当时delegate是可以被修改的,这个功能非常地强大。Gradle中的闭包有很多功能是通过修改delegate实现的。

下面看一段代码:

task helloDelegate{
    new Delegate().test{
        println "thisObject: ${thisObject.getClass()}"
        println "ower:${owner.getClass()}"
        println "delegate:${delegate.getClass()}"
        method1()
        it.method1()
    }
}

def method1(){
    println "Context this:${this.getClass()} in root"
    println "method1 in root"
}

class Delegate{
    def method1(){
        println "Delegate this:${this.getClass()} in Delegate"
        println "method1 in Delegate"
    }
    
    def test(Closure<Delegate> closure){
        closure(this)
    }
}

运行结果:

thisObject: class build_euvgp8ua408ivvs8hgkf7dmfi
ower:class build_euvgp8ua408ivvs8hgkf7dmfi$_run_closure7
delegate:class build_euvgp8ua408ivvs8hgkf7dmfi$_run_closure7
Context this:class build_euvgp8ua408ivvs8hgkf7dmfi in root
method1 in root
Delegate this:class Delegate in Delegate
method1 in Delegate
上一篇下一篇

猜你喜欢

热点阅读