摘要Groovy是一种基于Java平台的面向对象语言。 Groovy语法与Java非常类似,可以使用现有的Java库进行Groovy开发。 可以认为这是Java语言更简单、表现力更高的变体。
用Groovy编写的所有内容都可以编译成标准的Java类文件,并在Java代码中重用。 同样,用标准Java代码编写的内容也可以在Groovy中重用。 因此,可以使用Groovy轻松编写Java代码的单元测试。 另外,通过在Groovy中创建有用的小工具,Java程序也可以使用该小工具。
我们为什么要学习Groovy语言呢?
Groovy是一种更有生产力的语言。 它具有松散的语法和一些特殊的功能,可以提高编码速度。
在Android开发中,我们经常接触Gradle,但在前一篇博客中,Gradle是构建使用Groovy语言实现的项目的框架,如果不懂Groovy,就不能说我们熟悉Gradle
前面介绍的几个关于Gradle的博客涉及Groovy,包括Gradle的配置和插件开发。 那么,现在重读Grovvy的介绍报道,心情会变得很吃惊。
Groovy语言的几个特点:
Groovy松散的Java语法可以省略分号和return关键字。 变量类型和方法的返回值也可以省略。 调用方法时,也可以省略括号。 除非另有说明,否则Groovy的所有内容都是公共的。 Groovy允许您定义简单的脚本,而无需定义正规的class对象。 Groovy为常见的Java对象添加了自己的方法和快捷方式,使其更易于使用。 Groovy语法还可以省略变量类型。 官方网站
Groovy API文档:遇到不知道的类和方法时,这是一个很好的帮助器。
运行环境我们可以安装Groovy SDK来设置运行环境。 如果不想照顾,也可以在安卓项目中运行Groovy。
在build.Gradle中编写代码,以前的博客gradle使用指南gradleTask已经通过用漂亮的心巾创建Task,用task创建Groovy代码来使用。
1
2
3
4
5
6
7
8
9
10
11
12
13
任务助手{
doFirst {
println 'task hello doFirst '
Student st=new Student ()
ST.setstudentname(wwdcg ) )。
println(ST.getstudentname ) );
}
}
类student {
字符串稳定名称;
}
然后运行./gradlew hello命令。
插件,请参阅博客Gradle用户指南创建插件
在build.gradle中直接调用Groovy方法的一种方法是前面两种方法的组合,但不需要创建gradle插件。
要在buildSrc中创建TestGroovy.groovy文件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package com.Android.HQ.my first plugin
公共类测试全局{
公共静态语音测试全局
Student st=new Student ()
ST.setstudentname(James );
println(ST.getstudentname ) )
}
公共静态类稳定{
字符串稳定名称;
}
}
在Task中调用方法:
1
2
3
4
5
6
任务助手{
doFirst {
println 'task hello doFirst '
TestGroovy.testGroovy (
}
}
然后,可以执行./gradlew hello命令;
Groovy
入门由于 Groovy 和 Java 极其的类似,因此,基本的语法规范就参考W3C school Groovy教程即可,下面只来介绍一下 Groovy 的一些新特性。
变量类型定义和方法声明在 Java 中,变量是必须指定类型的,但是在 Groovy 中,所有的变量类型都可以用 def 去指定,Groovy 会根据对象的值来判断它的类型。
1
2
3
4
def helloStr = "Hello World";
def a = 1, b = 2
println helloStr
println a + b
函数的的返回值的类型当然也可以用 def 来声明:
1
2
3
def getStr() {
return "Hello World"
}
在声明函数时,参数变量的类型是可以省略的:
1
2
3
def add(arg1, arg2) {
return arg1+arg2
}
前面我们说过,方法返回值的关键字 return 是可以省略的:
1
2
3
def add(arg1, arg2) {
arg1+arg2
}
方法调用时括号是可以省略的,见 println a + b 的调用。
在 Groovy 中,类型是弱化的,所有的类型都可以动态推断,但是 Groovy 仍然是强类型的语言,类型不匹配仍然会报错;
上述两个类完全一致,只有有属性就有Getter/Setter;同理,只要有Getter/Setter,那么它就有隐含属性。
字符串在Groovy中有两种风格的字符串:String(java.lang.String)和GString(groovy.lang.GString)。GString允许有占位符而且允许在运行时对占位符进行解析和计算。
这里我们只介绍对占位符的一种使用:嵌入表达式
嵌入表达式
1
2
3
4
def worldStr = "World"
def helloStr = "Hello ${worldStr}";
println helloStr
println "value: ${3+3}"
除了${}占位符的{}其实是可以省去的。
占位符里面可以包含一个闭包表达式。
Getter/Setter 方法
在Groovy中,对象的 Getter/Setter 方法和属性是默认关联的,比如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public static class Student {
String StudentName;
}
public static class Student {
String StudentName;
String getStudentName() {
return StudentName
}
void setStudentName(String studentName) {
StudentName = studentName
}
}
with 方法
当对同一个对象进行操作时,可以使用 with:
1
2
3
4
5
6
7
8
9
10
11
12
Student st = new Student()
st.with {
id = 10;
name = "James";
}
println st.getName()
......
public static class Student {
def name
def id
}
join 方法
用指定的字符连接集合中的元素:
1
2
def list = [2017,1,6]
println list.join("-")
其他实用方法请参考 Groovy API 文档中的 DefaultGroovyMethods。
闭包闭包是一个短的匿名代码块。它通常跨越几行代码。一个方法甚至可以将代码块作为参数。它们是匿名的。
下面是一个简单闭包的例子:
1
2
3
4
5
6
7
8
9
def clos = {
def worldStr = "World"
def helloStr = "Hello $worldStr";
println helloStr
def person = [name: 'wwdcg', age: 36]
println "$person.name is $person.age years old"
}
clos.call()
代码行 {…}被称为闭包。此标识符引用的代码块可以使用call语句执行。
闭包也可以包含形式参数,以使它们更有用,就像Groovy中的方法一样。
1
2
3
4
5
def clos = { param ->
def helloStr = "Hello $param";
println helloStr
}
clos.call("World")
如果闭包不指定参数,那么它会有一个隐含的参数 it:
1
2
3
4
5
def clos = {
def helloStr = "Hello $it";
println helloStr
}
clos.call("World")
闭包可以有返回值:
1
2
3
4
5
def clos = {
def helloStr = "Hello $it";
return helloStr
}
println clos.call("World")
闭包还可以作方法的参数。
本地集合 内置的正则表达式 学习资料W3C school Groovy教程
Gradle从入门到实战 - Groovy基础