1、没有类型的java
作为动态语言,groovy中所有的变量都是对象(类似于.net framework,所有对象继承自java.lang.Object),
在声明一个变量时,groovy不要求强制类型声明,仅仅要求变量名前使用关键字def。
def?var="hello world"
println?var
println?var.class
你可以看到程序最后输出了var的实际类型为:java.lang.String
作为例外,方法参数和循环变量的声明不需要def。
2、不需要的public
你可以把main方法前面的public去掉,实际上,groovy中默认的修饰符就是public,所以public修饰符你根本就不需要写,这点跟java不一样。
3、一切皆对象
听起来象是“众生平等”的味道,事实上groovy对于对象是什么类型并不关心,一个变量的类型在运行中随时可以改变,一切根据需要而定。
如果你赋给它boolean?,那么不管它原来是什么类型,它接受boolean值之后就会自动把类型转变为boolean值。看下面的代码:
"hello "+
???????"world"+
",groovy!"
???????println?var;
println?var.class;
???????var=1001
class
输出结果:
hello world,groovy!
class java.lang.String
class java.lang.Integer
?
var这个变量在程序运行中,类型在改变。一开始给它赋值String,它的类型就是String,后面给它赋值Integer,它又转变为Integer。
循环
代码:
???????def?repeat(val){
????????????for(i =?0; i <?5; i++){
?????????????println?val
????????????}
???????}
???????repeat(var)
输出:
注意循环变量i前面没有def。当然也没有java中常见的int,但如果你非要加上int也不会有错,
因为从Groovy1.1beta2之后开始(不包括1.1beta2),groovy开始支持java经典的for循环写法。
此外,上面的for语句还可以写成:
for(i?in?0..5)
这样的结果是一样的。?
范围
这个跟pascal中的“子界”是一样的。在前面的for循环介绍中我们已经使用过的in?0..5)这样的用法,其中的0..5就是一个范围。
范围?是一系列的值。例如?“0..4”?表明包含?整数?0、1、2、3、4。Groovy?还支持排除范围,“0..<4”?表示?0、1、2、3。还可以创建字符范围:“a..e”?相当于?a、b、c、d、e。“a..<e”?包括小于?e?的所有值。
范围主要在for循环中使用。
?? ? ??
集合
Groovy支持最常见的两个java集合:java.util.Collection和java.util.Map。前面所说的范围实际也是集合的一种(java.util.List)。
(1) Collection
Groovy?中这样来定义一个Collection:
def?collect=["a","b",204)">"c"]
除了声明时往集合中添加元素外,还可以用以下方式向集合中添加元素:
collect.add(1);
collect<<"come on";
collect[collect.size()]=100.0
Collection使用类似数组下标的方式进行检索:
println?size()-1]
collect[5]
groovy支持负索引:
collect[-1]??????//索引其倒数第1个元素
collect[-2]??????//索引其倒数第2个元素
Collection支持集合运算:
collect=collect+5????????//在集合中添加元素5
size()-1]
collect-'a'?????????在集合中减去元素a(第1个)
collect[0]??????????现在第个元素变成b了
同样地,你可以往集合中添加另一个集合或删除一个集合:
collect-collect[0..4]???把集合中的前5个元素去掉
collect[0]???现在集合中仅有一个元素,即原来的最后一个元素
collect[-1]??也可以用负索引,证明最后一个元素就是第一个元素
(2) Map
Map是“键-值”对的集合,在groovy中,键不一定是String,可以是任何对象(实际上Groovy中的Map就是java.util.)。
如此可以定义一个Map:
def?map=['name':'john',204)">'age':14,204)">'sex':'boy']
添加项:
???????map=map+['weight':25]???????添加john的体重
???????map.put('length',1.27)??????的身高
???????map.father='Keller'?????????的父亲
可以用两种方式检索值:
println?map['father']???????//通过key作为下标索引
println?map.length??????????//通过key作为成员名索引
字符串
Groovy中的字符串允许使用双引号和单引号。
当使用双引号时,可以在字符串内嵌入一些运算式,Groovy允许您使用 与 bash 类似的 ${expression} 语法进行替换。可以在字符串中包含任意的Groovy表达式。
name="James"
println "My name is ${name},'00${6+1}'" //prints My name is James,'007'
Groovy还支持"uXXXX" 引用(其中X是16进制数),用来表示特殊字符,例如 "u0040" 与"@"字符相同。
对字符串的操作
- contains 字符串中是否包含子字符串,'groovy'.contains('oo')将返回true;
- count 返回字符串中子字符串出现的次数,'groooovy'.count('oo')将返回3.
- tokenize 根据分隔符将字符串分解成子串,'apple^banana^grap'.tokenize('^')返回['apple','banana','grape']。
- 减操作 'groovy'-'oo',结果是'grvy'。
- 乘操作 'oo'*3,结果是'oooooo'。