1. 安全導航操做符 ?.,只有對象引用不爲空時纔會分派調用。java
def a a?.isEmpty()
2. groovy不強迫捕獲咱們不關心的異常。數組
捕獲全部Exception 安全
try{ }catch(ex){ }
3. groovy默認都是public的。閉包
4. groovy默認提供構造器。dom
class Robot{ def type, height, width } robot = new Robot(type: 'arm', width: 10, height: 40)
5. groovy傳參ide
出現鍵值對的形式,groovy會將全部鍵值對做爲第一個形參(Map)的Entry,其他參數按順序賦給剩餘形參。spa
class Robot{ def access(location, weight, fragile){ print "$fragile, $weight, $location" } } robot.access(x: 30, y: 20, z:10, 5, true) //可改變順序 robot.access(5, true, x: 30, y: 20, z:10)
注意:使用鍵值對傳參,最好是當參數僅有一個Map時使用;.net
若是必定要使用一個Map + 多個參數傳遞的形式,請顯示聲明Map類型。
code
class Robot{ def access(Map location, weight, fragile){ print "$fragile, $weight, $location" } }
當實參包含的不是兩個對象和一個任意鍵值對,代碼就會報錯。對象
6. 可選形參, 方法能夠不用再寫重載
def log(x, base = 10){ Math.log(x) / Math.log(base) }
6.1 變長傳參
最後一位形參是數組形式
def receiveVarArgs(int a, int... b){} def receiveVarArg(int a, int[] b){}
注意:Groovy將 [2, 3]看做是ArrayList的一個實例對象,所以調用時:
receiveVarArgs(1, [2, 3, 4] as int[])
可參考Groovy建立數組、列表的區別:
int[] arr = [1, 2, 3] def arr1 = [1, 2, 3] as int[] def arr2 = [1, 2, 3] //ArrayList類型
7. 多賦值。返回數組,被多賦值給各個變量。
等號左邊變量多的,將設爲null(不能默認null的,拋異常),右邊值多的,將丟棄。
def splitName(fullName){ fullName.split(' ') } def (firstName, lastName) = splitName('James Bond')
所以能夠延伸爲交換變量
def a = 1 def b = 2 (a, b) = [b, a]
8. 實現接口
一接口,單方法
def diaplyMouseLocation = {positionLabel.setText("$it.x, $it.y")} frame.addMouseListener(diaplyMouseLocation as MouseListener)
一接口,多方法
def handleFocus = [ focusGained : {} focusLost : {} ]
動態實現接口, asType()做爲何的接口實現
events = ['WindowListener', 'ComponentListener']//能夠是更動態的一些輸入 handler = {msgLabel.setText("$it")} for(event in events){ handlerImpl = handler.asType(Class.forName("java.awt.event.${event}")) frame."add${event}"(handlerImpl) }
9. 默認布爾處理
groovy基本都爲對象,除引用對象不爲空爲true外,有些對象還有以下狀況也爲true。
Boolean | 值爲true |
Collection | 不爲空 |
Map | 映射不爲空 |
Char | 不爲0 |
字符串 | 長度大於0 |
數字 | 不爲0 |
數組 | 長度大於0 |
其餘類型 | 不爲null |
自定製 | 經過asBoolean()方法來重寫 |
10. forEach
for(String greet : greetings){} for(def greet : greetings){}
不想指定類型:
for(greet in greetings){}
或者 內部迭代器 each()
10. 靜態導入支持別名
import static Math.random as rand double value = rand()
11. java的編譯時註解被忽略,如Override。
12. groovy既支持動態類型,又支持泛型。泛型在執行時進行檢查生效。
13. Groovy能夠重載操做符,由於每一個操做符都被映射到一個標準的方法。
14. 使用註解生成代碼
@Canonical 標註於類上,用於生成toString():逗號分隔各屬性,可排除屬性
@Canonical(excludes='lastName, age') class Person{}
@Delegate 用於引入被委託類相應的方法包裝器,用於委派任務。引入的具體實例方法與順序有關。
查找還未有的方法進行一次引入。
class Worker{ def work(){} def analyze(){} } class Expert{ def analyze(){} } class Manager{ @Delegate Expert expert = new Expert()//引入Expert實例的analyze方法 @Delegate Worker worker = new Worker()//引入Worker實例的work方法 }
@Immutable 標註在類上,用於便捷生成不可變值對象,即屬性final。同時提供hashCode()、equals()、toString()方法。
@Immutable class CreditCard{ String cardNumber int creditLimit }
@Lazy 標註於屬性上,懶加載
class Heavy{} class AsNeeded { @Lazy Heavy heavy = new Heavy() }
@Singleton 標註於類上,實現單例模式
@Singleton(lazy = true) class TheUnique{ }
15. ==
== 等於調用java的equals(),除非實現Comparable接口的類型,== 等於compareTo()
is()等於java的==
16. groovy匿名內部類使用可能會有問題,會將{……}實現體當作閉包。