1.Groovy 是没有类型的Java,所以定义变量的时候可以不指定类型,Groovy 会根据对象的值来判断其类型.
1. def str = "Hello world"
2. println str.class
2.通过Groovy进行循环
在Groovy中,for循环变得更简洁,更易阅读。首先,范围的定义方式更加简洁:0..4表明包含整数0,1,2,3,4; 0..<4 表示0,1,2,3; a..e 表示 a,b,c,d,e
1. for(i in 1..5){
2. println i
3. }
Groovy也支持默认参数值
1. def repeat(val, repeat=5){
2. for(i in 0..<repeat){
3. println val
4. }
5. }
6.
7. repeat("Hello world",2)
8. repeat("foo",4)
3. 操作集合
在Groovy中,我们可以用范围来定义集合或者数组。
如:
1. def range = 0..4
2. println range.class
3. def coll = ["Groovy","Java","Ruby"]
4. println coll.class
为某个集合添加元素时,我们可以使用以下几种方法
1. coll.add("Python")
2. coll << "Smalltalk"
3. coll[5] = "Perl"
检索方式也更加灵活
1. println coll[1]
Groovy还允许在集合中增加或去掉集合
1. def numbers = [1,2,3,4]
2. def numbers2 = numbers +5 //=[1,2,3,4,5]
3. println numbers2
4. def numbers3 = numbers - [2,3]//=[1,4]
5. println numbers3
一些特殊调用
1. def numbers = [1,2,3,4]
2. println numbers.join(";") //= 1;2;3;4 ,将集合的元素拼接成了字符串
3. println [1,2,3,4,3].count(3) //=2 统计元素出现的次数
4. ["Java","Groovy"]*.toUpperCase() // 全部转换成大写
请注意 *. 标记。对于以上列表中的每个值,都会调用 toUpperCase(),生成的集合中每个 String 实例都是大写的.
4.映射
定义Map
1. def hash = [name:"Andy", "VPN-#":45]
2. println hash.getClass() //=java.util.LinkedHashMap
name 看起来像一个变量,但是在幕后,Groovy 会将它变成 String。
操作键值对
1. hash.put("id",23)
2. hash.get("name")
3. hash.dob = "01/29/76"
4. println hash["name"] //="Andy"
请注意,在使用 [] 语法从映射获取项时,必须将项作为 String 引用。
5.闭包
使用闭包对集合进行迭代
1. def acoll = ["Groovy", "Java", "Ruby"]
2.
3. acoll.each{
4. println it
5. }
请注意,each 直接在 acoll 实例内调用,而 acoll 实例的类型是 ArrayList。在 each 调用之后,引入了一种新的语法 — {,然后是一些代码,然后是 }。由 {} 包围起来的代码块就是闭包。
闭包中的 it 变量是一个关键字,指向被调用的外部集合的每个值 — 它是默认值,可以用传递给闭包的参数覆盖它。下面的代码执行同样的操作,但使用自己的项变量:
1. def acoll = ["Groovy", "Java", "Ruby"]
2.
3. acoll.each{ value ->
4. println value
5. }
使用闭包迭代Map
1. def hash = [name:"Andy", "VPN-#":45]
2. hash.each{ key, value ->
3. "${key} : ${value}"
4. }
闭包的其他用途:因为闭包是一个代码块,所以能够作为参数进行传递(Groovy 中的函数或方法不能这样做)。闭包在调用的时候才会执行这一事实(不是在定义的时候)使得它们在某些场合上特别有用。
1. def excite = { word ->
2. return "${word}!!"
3. }
可以通过两种方法调用闭包:直接调用或者通过 call() 方法调用
1. assert "Groovy!!" == excite("Groovy")
2. assert "Java!!" == excite.call("Java")
6.Groovy 中的类
Groovy类就是Java类,我们先定义一个bean.
1. class
2. def name
3. def artist
4. def genre
5. static void
6. new Song(name:"Le Freak",
7. "Chic", genre:"Disco")
8. }
9. }
Groovy 自动提供一个构造函数,构造函数接受一个名称-值对的映射,这些名称-值对与类的属性相对应。这是 Groovy 的一项开箱即用的功能,除此之外,Groovy还生成了标准的 setter 和 getter 方法,所以可以像下面这样直接操纵类的属性,这些操作实际上都是通过setter,getter方法进行的,默认情况下,类的属性是私有的:
1. def sng3 = new
2. sng3.name = "Funkytown"
3. sng3.artist = "Lipps Inc."
4. sng3.setGenre("Disco")
5.
6. assert sng3.getArtist() == "Lipps Inc."
方法覆盖:
1. String toString(){
2. "${name}, ${artist}, ${genre}"
3. }
您可能已经想到:在 Groovy 中可以省略 return 语句。Groovy 默认返回方法的最后一行。所以在这个示例中,返回包含类属性的 String。
空指针安全性
Groovy 通过 ? 操作符提供了一个安全网 — 在方法调用前面添加一个 ? 就相当于在调用前面放了一个条件,可以防止在 null 对象上调用方法。
1. def d=null
2. println d?.toUpperCase()
3. d="Hello world"
4. println d?.toUpperCase()