Groovy 简单入门
参考资料:
http://blog.csdn.net/kmyhy/article/details/4200563
Groovy是什么
Groovy是一种脚本语言,不同于Java这种系统编程语言,同时脚本相对于系统编程语言,它的目标是不同的,脚本语言用于将应用程序连接起来,实现一些繁琐的,变动频繁的细节,如:copy文件,打包等等,如基于groovy的 gradle构建等;只需要非常少的代码,却实现了相当强大的功能;
Groovy是基于JVM的一种脚本语言,相对于JVM来说Groovy与Java是一样的;Groovy可使用Java中的各种API;
开发环境搭建
使用的开发工具是Android Studio,我使用的版本是2.2的,因Studio是集成有groovy的;我们建立一个Android项目后,然后建立一个 java lib 的module,并添加groovy的依赖:
建议 .groovy文件,
就可以编写groovy小例子了;
注意::建议groovy文件,是新建文件选择,再输入后缀的,比如:创立A.groovy文件,先选择new File
再 输入 A.groovy
注意:经过测试,发现这种方式使用groovy有问题,建议直接使用 java 工程来学习groovy,先配置好groovy环境,groovy环境配置比较简单;
基础语法
在Groovy中,调用函数不需要 加 括号,如下面的 println 方法;但建议调用自己的方法时,加上括号,如果不加括号,groovy认为是在调用某个属性;
// 没有类型
def var = "Hello World"; // def 用来声明变量
println var;
println var.class
// tab 都打印了,原样暑促
def var2 = """
Hello Better,
Good Luck!
"""
println(var2);
// 不关心对象类型
var = 1024;
println var;
println var.class; // Integer.class
// 简单循环,范围
for (i in 0..5) {
print(var + "\t");
}
println();
// Map
def map = ['name': 'better', 'age': 29, 'sex': 'man'];
println(map);
// 添加项
map = map + ['weight': 55];
map.put('height', 165); // 注意,这里是小括号
map.father = 'Better.Father' // 这个也行
// 检索
println(map['father']); // 通过key作为下标
println(map.height); // 通过key作为成员名变量
返回值
groovy中的变量定义可以不要类型,同样的返回值也不需要类型,groovy函数块,最后一个就是其返回值;
@Test
void testFunc() {
println(groovyFunc(1,2)) // 输出 1 2
}
def groovyFunc(arg1, arg2) {
println arg1
println arg2
arg1 + " " + arg2 // 最后一行是返回值
}
对字符串的处理
- 单引号,类似于Java中的String,不会对$进行处理,即就是字符串;
def h = 'Hello $ better' // 输出的 Hello $ better - 双引号,如果字符串中有$符号,会对$表达式进行先求值,没有则跟单引号类似;
def i = 128;
def str = 'Hello $i' // 输出的是 Hello 128 - 三引号,‘’‘XXX’‘’,就字符串进行换行输出;
闭包##
闭包用{}括起来的代码块,闭包是一种Groovy中的一种数据类型,它表示的是一段可执行的代码;
闭包的定义与使用如下:
def closure1 = { // closure1 表示是闭包类型数据变量
String param1, String param2 -> // -> 表示闭包定义的参数,箭头后面是代码
println param1 + " " + param2 // 闭包代码
return param1 // 最后一样是返回值,也可以不用return
}
// 闭包的调用方式1(类似java方法调用)
println closure1('hello', 'world')
// 闭包调用方式2,使用专用的call方法
println closure1.call('hello', 'world')
闭包定义的格式如下:
def closureName = {param -> code } 或者
def closureName = {无参数,纯code} // 没有 ->
grooy使用闭包来迭代:
// 闭包 (作为参数传递给map的each方法)
map.each { key, value -> println "$key:$value" };
map.each({ println it }); // it 为关键字,代表map集合中的每一项
map.each({ println it.key + "--->" + it.value });
// 闭包单独定义
def say = {
word -> println "Hi,$word welcome to grooy world!";
};
// 调用
say("Better");
say.call('Chelsea & Better');
输出:
Paste_Image.png闭包使用注意点####
- 省略圆括号
def list = [1,2,3,4]
// each 是个方法,但是这里却没有圆括号;
// 因为,在Groovy中,如果最后一个参数是闭包,可以省略圆括号;
list.each{
println it
}
- 确定闭包的参数,这个需要查阅api文档;
http://tool.oschina.net/apidocs/apidoc?api=groovy
动态性##
Groovy所有的对象都有一个元类,metaClass,通过metaClass属性,访问该元素;通过元类,可以为对象添加方法;
def msg = "Everything For Better Life!";
println msg.metaClass; // 元类
String.metaClass.up = { delegate.toUpperCase() };
String.metaClass.lower = { delegate.toLowerCase() };
println(msg.up());
println(msg.lower());
// 通过元类,可以检索对象所拥有的方法和属性(类似反射)
msg.metaClass.methods.each({ println it.name });
println("------------------");
msg.metaClass.properties.each( {println it.name });
// 判断是否有某个方法
if(msg.metaClass.respondsTo(msg, 'up')) {
println msg.toUpperCase()
}
// 判断是否有某个属性
if(msg.metaClass.hasProperty(msg, "bytes")) {
println msg.bytes.encodeBase64();
}