1. Groovy是什么
Groovy是基于JVM虚拟机的一种动态语言,语法和Java非常相似,并能够无缝地与Java代码集成和互操作,增加了很多动态类型和灵活的特性。(闭包、DSL)
语法和Java非常相似这个特点,意味着,如果我们完全不懂Groovy的语法,也可以按Java的语法来写Groovy代码。 这对于Java工程师来说是非常友好的。
不过,如果我们懂得一些Groovy的语法,那么对于Groovy的开发,会更加的方便和得心应手。以下是一些Groovy区别于Java的一些特性。
2. def类型推断
在 Groovy 编程语言中,def
关键字是一个非常灵活的声明符,它用于定义变量、方法或属性,并且允许类型推断。使用 def
时,编译器会根据所赋值的对象自动确定变量的类型,因此开发者不需要显式地指定变量的类型。
2.1 变量定义:
当你使用 def
声明一个变量时,Groovy 不需要知道变量的具体类型,它可以在运行时动态地决定变量的类型。
def a = 10 // a 将被推断为整数类型 Integer
def b = "Hello" // b 将被推断为字符串类型 String
2.2 可变类型:
使用 def
定义的变量可以改变其引用的对象类型,这是因为在 Groovy 中,变量本身没有固定的类型,而是指向了一个对象。
def c = true // c 被推断为布尔类型 Boolean
c = "World" // 现在 c 变成了字符串类型
2.3 方法定义:
在 Groovy 中,def
还可以用来定义方法(函数),此时方法返回的类型也是可以由编译器推断得出或者不返回任何值(void)。
def add(a, b) {
return a + b
}
2.4 属性定义:
在类中定义属性时,也可以使用 def
,这将创建一个具有隐式 getter 和 setter 的属性,其类型同样是动态推断的。
总之,def
关键字是 Groovy 动态特性的体现,它增强了代码的简洁性和灵活性,特别是在快速开发和脚本编写场景中表现尤为突出。不过,在大型项目或需要严格类型检查的情况下,可能需要更多地考虑是否使用明确类型的变量声明来增强代码的可读性和维护性。
3. 字符串
Groovy中的字符串和java中非常相似,还可以使用单引号''
task stringTest {
String str1 = "hello"
var str2 = "wrold"
def str3 = "!"
//print(str1 + str2 + str3)
println("${str1} ${str2} " + str3)
}
4. 列表
列表可以直接用[]
进行定义,遍历起来也非常方便
task listTest {
def list = [5, 6, 7, 8, 9]
println list[0]
//遍历方式一
for (int data in list) {
println(data)
}
//遍历方式二
for(int i in 0..4){
println(list[i])
}
}
5. Map
Map也是一样的,使用[key:value]
的形式定义,遍历也非常方便
task mapTest() {
def map = ["name": 'heiko', "age": 18]
println map["name"]
map.each {
println it
println it.key + ":" + it.value
}
}
task method {
def a = methodA(3, 5)
println(a)
}
6. 方法
groovy语法当中默认将函数非空(有代码的)最后一行作为结果进行返回
def methodA(int a, int b) {
//groovy语法当中默认将函数非空(有代码的)最后一行作为结果进行返回
a + b
}
7. 类
类的使用和Java中几乎一样
class Student {
private String name
private int age
private String getName() {
return name
}
private int getAge() {
return age
}
private void setName(String name) {
this.name = name
}
private void setAge(int age) {
this.age = age
}
@Override
String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
task classTest() {
Student student = new Student()
student.name = "heiko"
student.age = 20
println(student)
student.setName("XXX")
student.setAge(21)
println(student)
}
8. 闭包
本质是一个开放的、匿名的代码块,它可以接受参数、也可以有返回值。
可以认为闭包是一个匿名的接口或类。
8.1 语法
闭包的参数可以是0个、1个或多个
{ [params ->]
//具体代码
}
Groovy大括号
{}
是闭包,小括号()
是可以省略的,默认是带有小括号的,但是Groovy
因为是糖果语法可以省略小括号
闭包{}
只针对{}
区域内有效。
8.2 一个最简单的闭包
def myClosure = {
println("running start...")
println("running end...")
}
//调用闭包方式一
myClosure()
//调用闭包方式二
myClosure.call()
9. 示例 : 使用groovy语法读取一个文件 : .properties文件
def getUrlPath(String buildType) {
def url
Properties properties = new Properties()
def proFile = file("src/main/filters/" + buildType + "/config.properties")
if (proFile.canRead()) {
properties.load(new FileInputStream(proFile))
if (properties != null) {
url = properties["SERVER2"]
}
}
url
}
9. Gradle相关的其他文章
Android Gradle开发与应用 (一) : Gradle基础
Android Gradle开发与应用 (二) : Groovy基础语法
Android Gradle插件开发_实现自动复制文件插件