Groovy基础

一、概述

Gradle是一款优秀的构建系统工具,它是基于Groovy的DSL语言实现,Gradle在Android中具有很重要的位置,因此在学习Gradle之前,了解Groovy是必须的。

Groovy是基于JVM虚拟机的一种动态语言,与Java非常类似,因此Java学习者入门Groovy基本没有任何障碍,并且Groovy完全兼容Java。

1)Groovy之字符串

1、在Java中,每条语句都是以分号结束,但是在groovy中,分号不是必需的。

2、groovy中,单引号和双引号都可以定一个字符串常量(Java中单引号定义一个字符),不同的是单引号标记的是纯粹的字符串常量,而不是对字符串里的表达式做运算,但是双引号可以。例如如下:

task printString <<{
    def str1 = ''
    def str2 = ''

    println '单引号: '+str1.getClass().name
    println '双引号: '+str2.getClass().name

    def name = "张山"
    println '单引号变量: ${name}'
    println "双引号变量: ${name}"

}

// 命令行中输入: gradle printString, 输出如下:
:printString
单引号: java.lang.String
双引号: java.lang.String
单引号变量: ${name}
双引号变量: 张山

2)Groovy之集合

集合在Java中是经常用到的,groovy完全兼容了Java中的集合,同时还进行了扩展。这里主要介绍下List和Map的基本用法,其他集合的使用可做参考。

2.1) List

在Groovy中,定义一个List非常简单,如下:

task printList << {
    def numList = [1,2,3,4,5,6];
    println numList.getClass().name
    println numList[1]  // 访问第二个元素
    println numList.get(1) // 访问第二个元素
    println numList[-1]   // 访问倒数第二个元素
    println numList[1..3] // 访问第二个到第四个元素
}

// 命令行中输入: gradle printList, 输出如下:
:printList
java.util.ArrayList
2
2
6
[2, 3, 4]

2.2) Map

Map用法和List很像,只不过它的值是一个K:V键值对。用法如下:

task printMap <<{
    def map = ['width':1234, 'height':4321]
    println map.getClass().name
    println map['width']
    map.each{
        println "key: ${it.key}, value:${it.value}"
    }
}
// 命令行中输入: gradle printMap, 输出如下:
:printMap
java.util.LinkedHashMap
1234
key: width, value:1234
key: height, value:4321

3) Groovy之方法

任何一门语言,方法都是不可缺少的部分,在groovy中,方法与Java有许多不同的用法,下面将一一讲解不同之处。

3.1) 括号可以省略

在Java中,调用一个方法为如下格式: func(parm1, parm2),

但是在groovy中,则要灵活多变,括号是可以省略的,例如如下:

task methodTest <<{
    method(1, 2)
    method 2,4
}
def method(int a, int b){
    println a+b
}

// 命令行中输入: gradle methodTest, 输出如下:
:methodTest
3
6

3.2) return是可以不写的

在Groovy中,我们方法的返回值是可以不写return语句的,Groovy会把方法执行过程的最后一句代码作为其返回值。例如如下:

task returnMethod <<{
    def max1 = method2(5, 2)
    def max2 = method2(1, 3)
    println "max1: ${max1}, max2: ${max2}"
}

def method2(int a, int b){
    if(a>b){
        a
    }else{
        b
    }
}
// 命令行中输入: gradle returnMethod, 输出如下:
:returnMethod
max1: 5, max2: 3

3.3) 传递代码块

在groovy中,代码块也可以作为函数的参数,类似于传递一个函数指针。 如下:

task invokeMethod1 <<{
    // 传递代码块
    method1({
        println "1-->method1"
    })
    
    // groovy中,最后一个参数是闭包(闭包下面会讲到),可以放到方法外面,如下:
    method1(){
        println "2-->method1"
    }
    
    // 方法的括号也可以省略,最后入下: 
    method1{
        println "3-->method1"
    }
}
def method1(def func){
    func()
}

// 命令行中输入: gradle invokeMethod1, 输出如下:
:invokeMethod1
1-->method1
2-->method1
3-->method1

4) Groovy之闭包

闭包是groovy一个非常重要的特性,闭包可以让代码更加灵活、轻量、可复用。

闭包其实就是一段代码块,上面的传递代码块其实就是闭包的使用。

当闭包只有一个参数是,默认就是it,例如如下:

task helloClosure << {
    customEach{
        println it
    }
}

def customEach(closure){
    for(int i in 1..10){
        closure(i)
    }
}

// 命令行中输入: gradle helloClosure, 输出如下:
:helloClosure
1
2
3
4
5
6
7
8
9
10

当有多个参数,就不能用it了,我们需要把参数一一列出,如下:

task mapClosure << {
    eachMap{
        k, v -> println "${k} is ${v}"
    }
}

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

// 命令行中输入: gradle mapClosure, 输出如下:

:mapClosure
name is 张三
age is 18

到此,我们简单的介绍了groovy的基本语法,想系统的去学习,可以参考 Groovy教程

参考文献

《Android+Gradle权威指南》

猜你喜欢

转载自blog.csdn.net/u010349644/article/details/81191789