您的位置:首页 > 其它

Gradle从入门到实战 - Groovy基础

2017-07-29 23:58 381 查看
转载自:
http://blog.csdn.net/singwhatiwanna/article/details/76084580

前言

Android方向的第一期文章,会专注于Gradle系列,名字叫做『 Gradle从入门到实战』,计划有如下几个课程:
Groovy基础
全面理解Gradle
如何创建Gradle插件
分析Android的build tools插件
实战,从0到1完成一款Gradle插件
本篇文章讲解Groovy基础。为什么是Groovy基础呢,因为玩转Gradle并不需要学习Groovy的全部细节。Groovy是一门jvm语言,功能比较强大,细节也很多,全部学习的话比较耗时,对我们来说收益较小。

为什么是Gradle?

Gradle是目前android主流的构建工具,不管你是通过命令行还是通过AndroidStudio来build,最终都是通过Gradle来实现的。所以学习Gradle非常重要。
目前国内对Android领域的探索已经越来越深,不少技术领域如插件化、热修复、构建系统等都对Gradle有迫切的需求,不懂Gradle将无法完成上述事情。所以Gradle必须要学习。

如何学习Gradle?

大部分人对Gradle表示一脸懵逼,每当遇到一个问题的时候都需要从网上去查,这是一个误区。
Gradle不单单是一个配置脚本,它的背后是几门语言,如果硬让我说,我认为是三门语言。
Groovy Language
Gradle DSL
Android DSL
DSL的全称是Domain Specific Language,即领域特定语言,或者直接翻译成“特定领域的语言”,算了,再直接点,其实就是这个语言不通用,只能用于特定的某个领域,俗称“小语言”。因此DSL也是语言。
在你不懂这三门语言的情况下,你很难达到精通Gradle的程度。这个时候从网上搜索,或者自己记忆的一些配置,其实对你来说是很大的负担。但是把它们当做语言来学习,则不需要记忆这些配置,因为语言都是有文档的,我们只需要学语法然后查文档即可,没错,这就是学习方法,这就是正道。
你需要做什么呢?跟着我学习就行啦!下面步入正题,让我们来开始学习Groovy的基本语法。

Groovy和Java的关系

Groovy是一门jvm语言,它最终是要编译成class文件然后在jvm上执行,所以Java语言的特性Groovy都支持,我们完全可以混写Java和Groovy。

既然如此,那Groovy的优势是什么呢?简单来说,Groovy提供了更加灵活简单的语法,大量的语法糖以及闭包特性可以让你用更少的代码来实现和Java同样的功能。比如解析xml文件,Groovy就非常方便,只需要几行代码就能搞定,而如果用Java则需要几十行代码。

Groovy的变量和方法声明

在Groovy中,通过 def 关键字来声明变量和方法,比如:
def a = 1;
def b = "hello world";
def int c = 1;

def hello() {
println ("hello world");
return 1;
}
在Groovy中,很多东西都是可以省略的,比如
语句后面的分号是可以省略的
变量的类型和方法的返回值也是可以省略的
方法调用时,括号也是可以省略的
甚至语句中的return都是可以省略的
所以上面的代码也可以写成如下形式:
def a = 1
def b = "hello world"
def int c = 1

def hello() {
println "hello world" // 方法调用省略括号
1;                    // 方法返回值省略return
}

def hello(String msg) {
println (msg)
}

// 方法省略参数类型
int hello(msg) {
println (msg)
return 1
}

// 方法省略参数类型
int hello(msg) {
println msg
return 1 // 这个return不能省略
println "done"
}
总结
在Groovy中,类型是弱化的,所有的类型都可以动态推断,但是Groovy仍然是强类型的语言,类型不匹配仍然会报错;
在Groovy中很多东西都可以省略,所以寻找一种自己喜欢的写法;
Groovy中的注释和Java中相同。

Groovy的数据类型

在Groovy中,数据类型有:
Java中的基本数据类型
Java中的对象
Closure(闭包)
加强的List、Map等集合类型
加强的File、Stream等IO类型
类型可以显示声明,也可以用 def 来声明,用 def 声明的类型Groovy将会进行类型推断。
基本数据类型和对象这里不再多说,和Java中的一致,只不过在Gradle中,对象默认的修饰符为public。下面主要说下String、闭包、集合和IO等。
1. String
String的特色在于字符串的拼接,比如
def a = 1
def b = "hello"
def c = "a=${a}, b=${b}"
println c

outputs:
a=1, b=hello
2. 闭包
Groovy中有一种特殊的类型,叫做Closure,翻译过来就是闭包,这是一种类似于C语言中函数指针的东西。闭包用起来非常方便,在Groovy中,闭包作为一种特殊的数据类型而存在,闭包可以作为方法的参数和返回值,也可以作为一个变量而存在。
如何声明闭包?
{ parameters ->
code
}
闭包可以有返回值和参数,当然也可以没有。下面是几个具体的例子:
def closure = { int a, String b ->
println "a=${a}, b=${b}, I am a closure!"
}

// 这里省略了闭包的参数类型
def test = { a, b ->
println "a=${a}, b=${b}, I am a closure!"
}

def ryg = { a, b ->
a + b
}

closure(100, "renyugang")
test.call(100, 200)
def c = ryg(100,200)
println c
闭包可以当做函数一样使用,在上面的例子中,将会得到如下输出:
a=100, b=renyugang, I am a closure!
a=100, b=200, I am a closure!
300
另外,如果闭包不指定参数,那么它会有一个隐含的参数 it
// 这里省略了闭包的参数类型
def test = {
println "find ${it}, I am a closure!"
}
test(100)

outputs:
find 100, I am a closure!
闭包的一个难题是如何确定闭包的参数,尤其当我们调用Groovy的API时,这个时候没有其他办法,只有查询Groovy的文档:
http://www.groovy-lang.org/api.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: