groovy 經常使用語法總結

Groovy的強大特性中,Closure,MetaClass都嘗試過,Closure基本上就是當方法或者回調接口使用,再高級的用法就沒用過了,沒有特別體會什麼好處,當回調接口就是省的定義接口,簡潔了一些;MetaClass就有專門爲一個模塊作了些MetaClass,和GORM差很少的,給一些類加了save,update,delete之類的方法,不一樣的是GORM是存到數據庫,我作的那模塊是調用Restful Service,還不錯,若是有需求是不能改變類而要給類加方法,仍是很適用的。可是在絕大部分狀況下,這些優點都體現不出來,到目前位置,仍是對Groovy的一些語法印象深入些,總結一些經常使用的語法:javascript

1.List,和Map的初始化java

這個用的最多了,原來java的時候,非要新建一個List或者Map,而後把element一個一個加進去,特繁瑣。用Groovy在語法上簡潔了不少。數據庫

定義一個List: 安全

[java] view plaincopyeclipse

List intList = [1,3,5,7,9]  函數

List stringList = ['a', 'b','']  this


定義一個Map:spa

[java] view plaincopy代理

Map map = [a:4,b:'d']  orm


定義Map的時候,對於key,若是像上面的例子同樣,沒有特別指示,那全部key都是String類型的,key值就是‘a’,'b',上面的例子等價於

[java] view plaincopy

Map map = ['a':4,'b':'d']  


某些時候,map的key多是存在的一個變量,那這個時候,就要用括號把key抱起來,好比

[java] view plaincopy

String a = 'I am Key'  

Map map = [(a):'I am Value']  


也能夠定義空的List或者Map

[java] view plaincopy

List empty = []  

Map empty = [:]  

須要知道的是,這種方式新建的List實例是ArrayList,Map實例是LinkedHashMap

2.二元運算符 ?:

java繼承了C語言的問號表達式,二元運算符就是更加精簡的問號表達式。形式:

[java] view plaincopy

def result = a ?: b  


意爲,若是條件爲真,即a爲true或者a有值,則result爲a,不然result爲b

3.安全佔位符

這個頗有用,能夠避免不少NullPointerException,可是也不能濫用了

[java] view plaincopy

def result = obj?.property  


代碼裏,obj是個對象,property是對象的一個熟悉,這行代碼的意思,若是obj不爲null,則會返回property屬性的值,若是obj爲null,這會直接返回null。語句能夠一直串下去

[java] view plaincopy

def result = a?.b?.c?.d...  


4.字段操做

按照Groovy Bean的標準,默認的時候類裏面的全部字段,Groovy都會幫忙生成一個get方法。在類的外部,即使你直接用了屬性名而不用get方法去取值,拿到的也是經過get方法拿到的值。若是想直接拿屬性值怎麼辦呢? 經過字段運算符:

[java] view plaincopy

class A {  

   String b  

}  

  

A a = new A()  

a.b //經過get方法拿值  

a.getB() //經過get方法拿值  

a.@b //直接拿值  


5.GString

Java裏有String,Groovy裏新加了GString。Groovy的語法是,若是用單引號括起來的就是String,若是是雙引號括起來的就是GString。因此Groovy不能直接定義原來Java裏的char了。

String

[java] view plaincopy

String s = 'This is a String'  


GString

[java] view plaincopy

GString s = "This is a GString"  


兩種方式定義出來的實例類型是不同的。固然GString不是這麼簡單的,GString的強大之處在於它能夠做爲模板使用

[java] view plaincopy

String name = 'count'  

int value1 = 23  

int value2 = 22  

GString s = "The value of $name is ${value1+value2}"   

println s  


最終的輸出是: The value of count is 55

倒數第二行,裏面有關鍵字符 $, $即表明去引用上下文中的變量值,而${}中間不只能夠引用變量值,還能夠加上一些運算,做爲一個表達式

最後一行這是把GString轉換成String,再輸出。

String是常量,可是GString是變量,準確的說,在GString中的$僅僅是做爲一個模板的佔位符存在,GString會保存對那個對象的引用,若是引用的對象值發生改變,GString的值也就跟着改變。

須要注意的是,Map裏面String和GString就算最終生成的String值同樣,可是仍是看成兩個key存在的。很容易理解,可是很容易犯的錯誤,好比手誤把單引號寫成了雙引號等等都會引發這個錯誤。

6.構造函數

[java] view plaincopy

class ClassA {  

    String s1  

    int i1  

    ClassB cb  

}  

class ClassB {  

    String s2  

}  

new ClassA(s1:'pro in A', i1:5, cb:[s2:'pro in B'])  


以上代碼是能夠工做的,Groovy會建立一個ClassA的實例,並把‘pro in A’ 和 5 分別設到屬性s1和i1裏。即使有一個複雜類型的熟悉cb,也能正常工做,ClassB的對象會被建立出來,並設到屬性cb上。ClassB裏的s2熟悉固然就是'pro in B'了。

能夠看到構造函數裏的參數很像Map的定義,確實,其實傳入Map也是能夠的

[java] view plaincopy

new ClassA([s1:'pro in A', i1:5, cb:[s2:'pro in B']])  


這個功能,在一些數據模型轉換的時候,比較方便。打個比方,前臺來的JSON數據,直接全轉成Map,再用構造函數new一下,就所有出來了。注意的是,若是Map存在某個類裏沒有的屬性值,會出錯誤的。

7.asType

用Groovy的是,可能常常看到這樣的代碼

[java] view plaincopy

String a = '78'  

int b = a as int  

print b  


第二行,有個關鍵字as,能夠看出來做用就是把String類型的a轉成int類型的b。它是怎麼工做的呢,很簡單,就是把這個操做代理給了String的asType方法,好比String有以下的方法(僅僅是例子,代碼中不是這樣)

[java] view plaincopy

class String {  

    Object asType(Class clz) {  

         if(clz == Integer) {  

                return Integer.parseInt(this)  

         } else if(clz == GString) {  

                 return "$this"  

         } else {  

                 return super.asType(clz)  

         }  

    }  

}  


那麼,String就能夠用as運算符轉換成int或者GString類型

[java] view plaincopy

String a = '45'  

int b = a as int  

GString c = a as GString  


上面的 clz == GString 是合法的,在Groovy裏等價於 clz == GString.class

8. inspect和eval

eval就和javascript裏的eval同樣,就是直接執行一段Groovy腳本,能夠用Eval.me(...script here...)直接調用。

inspect就是eval的反相操做了,就是把一個對象轉成一個合法的可執行的腳本(個人理解,沒仔細看過文檔)。沒試過其餘對象,可是像Map,List之類的均可以轉出來。這就夠了,Map,List轉出來的數據之於Groovy就至關於JSON之於JavaScript。在系統內部的時候就能夠直接看成數據傳輸,雖然你們都不推薦這麼用,可是我仍是堅持,若是數據只包含Map,List,Number,String等簡單類型,爲何不用呢?(若是Number裏值是NaN或者Infinite的時候有問題,可是很容易解決,看Eval類裏的其餘兩個方法就知道了)。呵呵,我也就這麼用着,直到發現了一個Bug(http://stackoverflow.com/questions/7410252/groovy-inspect-handle-dollar-sign),無法解決,我才換掉了實現。

可是我對這個東西仍是有很大期待,若是都是內部集成,不存在安全問題,且沒有很好JSON支持的時候,這種方式仍是很好的方式。


9.is方法

按照Groovy的定義,== 操做等於調用equals方法。這樣,咱們就失去了直接判斷兩個對象是否是同一對象的運算符。要判斷是否是同一個對象,要調用is方法,好比thisObject.is(anotherObject)。這點很是重要,特別是在overwrite對象的equals方法的時候,eclipse自動生成的代碼裏面有些地方不能直接用==了,而要用is方法。


就這麼多吧,之後若是發現更多新東西的時候再加。

相關文章
相關標籤/搜索