1.Groovy 是没有类型的Java,所以定义变量的时候可以不指定类型,Groovy 会根据对象的值来判断其类型. 

groovy 使用java groovy foreach_方法调用


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 


groovy 使用java groovy foreach_方法调用



    1. for(i in 1..5){  
    2.   println i  
    3.  }




      Groovy也支持默认参数值 


    groovy 使用java groovy foreach_方法调用


    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中,我们可以用范围来定义集合或者数组。 


      如: 


    groovy 使用java groovy foreach_方法调用


    1. def range = 0..4
    2. println range.class
    3. def coll = ["Groovy","Java","Ruby"]  
    4. println coll.class



    为某个集合添加元素时,我们可以使用以下几种方法 


    groovy 使用java groovy foreach_方法调用


    1. coll.add("Python")  
    2. coll << "Smalltalk"
    3. coll[5] = "Perl"



    检索方式也更加灵活 



    groovy 使用java groovy foreach_方法调用


    1. println coll[1]




    Groovy还允许在集合中增加或去掉集合 


    groovy 使用java groovy foreach_方法调用


    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



    一些特殊调用 


    groovy 使用java groovy foreach_方法调用


    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 


    groovy 使用java groovy foreach_方法调用


    1. def hash = [name:"Andy", "VPN-#":45]  
    2. println hash.getClass() //=java.util.LinkedHashMap


    name 看起来像一个变量,但是在幕后,Groovy 会将它变成 String。 


    操作键值对 


    groovy 使用java groovy foreach_方法调用

    1. hash.put("id",23)  
    2. hash.get("name")  
    3. hash.dob = "01/29/76"
    4. println hash["name"] //="Andy"




    请注意,在使用 [] 语法从映射获取项时,必须将项作为 String 引用。 



    5.闭包 



    使用闭包对集合进行迭代 



    groovy 使用java groovy foreach_方法调用


    1. def acoll = ["Groovy", "Java", "Ruby"]  
    2.           
    3. acoll.each{  
    4.  println it  
    5. }



    请注意,each 直接在 acoll 实例内调用,而 acoll 实例的类型是 ArrayList。在 each 调用之后,引入了一种新的语法 — {,然后是一些代码,然后是 }。由 {} 包围起来的代码块就是闭包。 



    闭包中的 it 变量是一个关键字,指向被调用的外部集合的每个值 — 它是默认值,可以用传递给闭包的参数覆盖它。下面的代码执行同样的操作,但使用自己的项变量: 



    groovy 使用java groovy foreach_方法调用

    1. def acoll = ["Groovy", "Java", "Ruby"]  
    2.           
    3. acoll.each{ value ->  
    4.  println value  
    5. }




    使用闭包迭代Map 


    groovy 使用java groovy foreach_方法调用

    1. def hash = [name:"Andy", "VPN-#":45]  
    2. hash.each{ key, value ->  
    3. "${key} : ${value}"
    4. }



    闭包的其他用途:因为闭包是一个代码块,所以能够作为参数进行传递(Groovy 中的函数或方法不能这样做)。闭包在调用的时候才会执行这一事实(不是在定义的时候)使得它们在某些场合上特别有用。 


    groovy 使用java groovy foreach_方法调用


    1. def excite = { word ->  
    2. return "${word}!!"
    3. }



    可以通过两种方法调用闭包:直接调用或者通过 call() 方法调用 


    groovy 使用java groovy foreach_方法调用


    1. assert "Groovy!!" == excite("Groovy")  
    2. assert "Java!!" == excite.call("Java")


    6.Groovy 中的类 


    Groovy类就是Java类,我们先定义一个bean. 


    groovy 使用java groovy foreach_方法调用


    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方法进行的,默认情况下,类的属性是私有的: 


    groovy 使用java groovy foreach_方法调用


    1. def sng3 = new
    2. sng3.name = "Funkytown"
    3. sng3.artist = "Lipps Inc."
    4. sng3.setGenre("Disco")  
    5.           
    6. assert sng3.getArtist() == "Lipps Inc."



    方法覆盖: 


    groovy 使用java groovy foreach_方法调用


    1. String toString(){  
    2. "${name}, ${artist}, ${genre}"
    3. }



    您可能已经想到:在 Groovy 中可以省略 return 语句。Groovy 默认返回方法的最后一行。所以在这个示例中,返回包含类属性的 String。 



    空指针安全性 


    Groovy 通过 ? 操作符提供了一个安全网 — 在方法调用前面添加一个 ? 就相当于在调用前面放了一个条件,可以防止在 null 对象上调用方法。 


    groovy 使用java groovy foreach_方法调用


    1. def d=null
    2. println d?.toUpperCase()  
    3. d="Hello world"
    4. println d?.toUpperCase()