Gradle详解(一)语法篇

最近打算研究下Android的编译工具gradle,说起来使用也快2年了,但是之前文档啥的都不太多,也没啥时间来深入研究一下,现在准备换工作,有时间了,来搞一搞。
首先介绍下groovy----gradle使用的语言。

groovy其实是一个java的简化版本,它基于java,并且优化了一些java的语法特性,开发者可以用脚本语言的形式来编写代码,但是其实底层还是把groovy编译成java类,对于喜欢使用java且不太会python等脚本语言的开发者来说,是一个不错的东西。

语法简介

groovy网站 http://www.groovy-lang.org ,虽然gradle自带了编译器,但是建议想学习groovy的同学们还是下载一个安装包,这样在平时的工作中也可以使用一下groovy。groovy的语法糖还是很多的,这里主要介绍下我觉得比较好的地方。

脚本特性

groovy执行有多种方式,可以直接在命令行执行,也可以保存为文件(下面例子需要先安装groovy)

#方式一:
groovy -e "10.times{println('cc')}"
#方式二
groovy MyScript.groovy
#或者
groovy MyScript
#方式三
groovyc  MyScript.groovy
java -cp %GROOVY_HOME%/embeddable/groovy-all-2.4.8.jar MyScript

类型优化

为什么要有类型定义?
在 Java 中,如果要声明一个 String变量,则必须输入:

String value = "Hello World";

但是,如果仔细想想,就会看出,等号右侧的字符已经表明 value的类型是 String。所以,Groovy 允许省略 value前面的 String类型变量,并用 def代替。

def value = "Hello World"

除了输出 value的值,还可以用以下调用输出它的类型:

def message = "Hello World"
println message.class 

函数定义时,参数的类型也可以不指定。比如

String function(arg1,args2){//无需指定参数类型
}

除了变量定义可以不指定类型外,Groovy中函数的返回值也可以是无类型的。比如:

//无类型的函数定义,必须使用def关键字
def  nonReturnTypeFunc(){
     last_line   //最后一行代码的执行结果就是本函数的返回值
}
//如果指定了函数返回类型,则可不必加def关键字来定义函数
String  getString(){
   "I am a string"
}

** groovy中最后一行代码就是函数的返回值 **

简写

groovy中定义的函数,如果至少有一个参数,在调用的时候可以省略括号。比如这样

def func(String a){
  println(a)
}
func 'hello'

在gradle有大量省略括号调用函数的例子,比如

compileSdkVersion rootProject.ext.compileSdkVersion
buildToolsVersion rootProject.ext.buildToolsVersion

默认修饰符为public

class Test{
    String name;
}

public成员变量默认有get,set函数,例如上面的Test类

println("my name is " + new Test().getName())

自动导入常用java库, 使用file等文件无需导入,但是一些第三方的还是需要import

groovy.lang.* 
groovy.util.* 
java.lang.* 
java.util.* 
java.net.* 
java.io.* 
java.math.BigInteger 
java.math.BigDecimal

变量引用

def nick = 'Gina' 
def book = 'Groovy in Action' 
assert "$nick is $book" == 'Gina is Groovy in Action'

list/map/range

def listA = ['1','2','3']
println(listA[1]) //'2'

def http = [ 100 : 'CONTINUE', 200 : 'OK']
println(http[200]) //'ok'

def x = 1..10
assert x.contains(5) 
assert x.size() == 10 
assert x.from == 1 
assert x.to == 10
for(i in x) ...

闭包 (重点,后面的gradle经常使用)

很多C程序员,都习惯传递方法指针作为方法的参数,但是在java里,却无法做到这一点,现在groovy福利来了,这就是闭包()
参考文章:

推荐阅读更多精彩内容