走進Groovy (二)

承接上一篇,配置好環境後,開始正式學習語法。我假設看此文的同窗至少會必定的JAVA語法,所以一些太過基礎的就不記錄了,基本上,你們看看示例就明白了。java

Groovy的賣點之一,就是全兼容JAVA的語法,所以你徹底能夠從一個JAVA文件中把源代碼複製到一個Groovy文件中而沒必要改寫任何一個字直接運行,不過這樣在groovy中寫JAVA就沒意思了,享受不到groovy帶來的樂趣了。數組

一個groovy文件,並不是像java文件同樣,必需要定義一個類且文件名必須和類名同樣,groovy文件中,你能夠同時定義好幾個類,也能夠沒有類,像這樣:閉包

println("hello groovy")
println "hello world"

能夠看到groovy對於代碼要求比較寬鬆,能夠沒有分號,能夠沒有函數調用時的括號。函數

當groovy引用JAVA類時,groovy自動會導入java.lang,java.util,java.io,java.net以及BigDecimal、BigInteger兩個類,以及一些groovy包。學習

一. 一些雜項的語法擴展

直接上代碼吧spa

//輸出從1到10,後面的是閉包,若是隻有一個參數,而且沒指定參數名的話,默認名就是it
1.upto(10) {
    println it
}

//從10到1
10.downto(1) {
    println it
}

//循環10次
10.times {
    println it
}

//至關 for(int i=0;i<10;i+=3)
0.step(10,3) {
    println it
}

//只有當實例不爲null時才調用方法
String str = null
println str?.toUpperCase()

//groovy對於異常比較寬鬆,能夠不處理異常,異常發生時會拋給調用者
Thread.sleep(10)  //不用必定要處理異常

 

二. 類定義及方法

  • 類和方法默認是public
  • 能夠沒有return,最後一項的值就是返回值
  • 用def申請屬性及方法,能夠不帶類型
class Book{
    //能夠指定類型,若是是給JAVA調用的,仍是指定類型的好
    String name
    //不指定類型
    def price
    
    def String toString(){
        "$name : $price"
    }
}

看看在JAVA中調用這個類的狀況:.net

image

能夠看到,groovy自動生成的getter和setter方法,只是若是沒有指定類型的話,類型默認是Object類型。code

 

三. 參數及返回值

  • 具名變量:靈活的初始化
  • 可選參數:方法的默認值
  • 多賦值:一次賦值多個變量
//具名參數,這要求類有無參構造函數
//至關於創建實例後,初始化各屬性
//具名參數比較靈活,特別是傳入map的時候,有需求的同窗本身查一下
def book = new Book(price:20.5, name:'Groovy Book')
println book

//默認參數(可選參數)
//可選參數必須位於參數最後邊
def say(txt,t=5){
    t.times {
        println txt
    }
}

//默認顯示5次
say 'hello'
//顯示3次
say 'world', 3

//返回多值
def mult(){
    [1,3] //把要返回的多個值放於數組中
}

//直接把數組分拆,賦值給a和b
//若是返回的值多於變量,則丟棄多餘值
//若是返回的值少於變量,則其他變量爲null
def (a,b) = mult()
println a
println b

 

四. 實現接口

grovvy中不要求實現全部接口方法,若是那些方法用不到的話,徹底能夠不實現。同時,只要參數一致,groovy中的代碼塊能夠轉成任意接口。blog

List<Integer> list = new ArrayList<Integer>()
list.add(1)
list.add(3)
list.add(7)
list.add(4)

//直接實現
list.sort({a,b->
    a <=> b  //飛船操做符 :)
})

for(x in list)
    println x

//實現有多個方法的接口    
interface Action{
    void eat();
    void drink();
}

def action = [
    eat: {println "amu amu" },
    drink: {println "gudu gudu" }
]

//定義調用接口的方法
def callAction(Action act){
    act.eat()
    act.drink()
}


callAction( action as Action )

五. 布爾轉換接口

在JAVA中,只有true和false兩種布爾值,在groovy中,則什麼類型均可以轉換爲布爾值,具體轉換以下:

類型 爲true的條件
Boolean 值爲true
Collection 集合不爲空
Character 值不爲0
CharSequence 長度大於0
Enumeration hasMoreElements()爲true
Iterator hasNext()爲true
Number 值不爲0
Map 不爲空
Matcher 至少一個匹配
數組 長度大於0
其餘類型 引用不爲null

在本身類中,若是實現asBoolean()方法,則能夠本身控制如何轉化爲boolean

//通常來講,若是引用不爲null則爲true
//可是實現了asBoolean方法的話,則按照該方法返回值
class MyBoolean{
    def asBoolean(){
        false
    }
}

def b = new MyBoolean()
println b ? "true" : "false"  //false
相關文章
相關標籤/搜索