承接上一篇,配置好環境後,開始正式學習語法。我假設看此文的同窗至少會必定的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) //不用必定要處理異常
class Book{ //能夠指定類型,若是是給JAVA調用的,仍是指定類型的好 String name //不指定類型 def price def String toString(){ "$name : $price" } }
看看在JAVA中調用這個類的狀況:.net
能夠看到,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