1 數值和表達式
1.1數值
- 整數是Integer類的實例
- 有小數部分的數值是BigDecimal類的實例
不同於java,沒有基礎數據類型
一切皆對象的概念重於java
1.2表達式
- 兩個整數的除法運算通常會產生一個浮點數
- 獲得兩個整型值相除的整數部分,使用#intdiv
- 浮點數取模非法
1.3運算優先級
*/% 優先於 +-
1.4賦值
- def先聲明變量,后使用
等同於js,弱類型
- 標識符 和java一樣的命名規則
1.5自增和自減運算符
類似於java
1.6對象引用
動態類型
變量引用的類型是在運行時確定,而不是在編譯時,類似於java的多態
也有垃圾回收機制,類似於java的
1.7關系運算符和等於運算符
關系運算符:< <= > >=通過#compareTo實現
等於運算符:== !=調用#equals <=>調用#compareTo
都是調用某個方法實現
2字符串和正則表達式
2.1字符串字面值
單引號:所見即所得
雙引號:解釋性字符串
三引號:解釋性字符串 多行文本用這個
單雙引號可混在一起使用,類似js;也可以使用\進行轉義,類似java
1 'He said "Hello"!' 2 'He said \"Hello\"!'
解釋性字符串中的${expression}都將被求值,結果作為字符串的一部分
1 def age=25 2 'My age is ${age}' //My age is ${age} 3 "My age is ${age}" //My age is 25 4 """//My age is ${age}""" //My age is 25 5 """My 6 age 7 is \${age}""" //My age is ${age}
解釋用雙,其他用單
2.2字符串索引和索引段
字符串是順序排列的字符集合
索引類似於java String的#charAt
獲取指定位置的字符類似於數組
1 def greeting='Hello World' 2 greeting[4] //o 3 greeting[-1] //d 4 greeting[1..2] //el 5 greeting[1..<3] //el 6 greeting[4..2] //oll 7 greeting[4,1,6] //oew
2.3基本操作
字符串不可變
等同於java
1 def greeting='Hello world' 2 'Hello'+'world' //Helloworld 3 'Hello'*3 //HelloHelloHello 4 greeting-'o world' //Hell 5 greeting.size() //11 6 greeting.length() //11 7 greeting.count('o') //2 8 greeting.contains('ell') //true
2.4字符串方法
1 def message='Hello' 2 message.center(11) //返回長度為11,左右兩邊均使用空格填充的字符串 3 message.center(3) 4 message.center(11,'#') 5 message.eachMatch('.')
2.5比較字符串
== 調用#equals
<==> 調用#compareTo
2.6正則表達式
-
~’regex’定義正則表達式
def regex=~’cheese’
-
if(‘cheesecake’=~’cheese’) //左邊String對象和右邊的正則匹配,返回布爾值
==~ 精確匹配 ‘cheesecake’==~’cheese’
\\\\在正則中表示一個反斜杠字符
類似於java中正則的使用,用單引號括起
也可以用js的方法,直接使用,不用引號
1 def matcher="\$abc."=~\\\$(.*)\\. 2 def matcher="\$abc."=~/\$(.*)\./
3列表、映射和范圍
3.1列表
類似於java的List,增加了一些自己的方法
-
列表對象和訪問列表元素
1 def numbers=[11,12,13,14] 2 number[0] //11 3 number[-1] //14
[]調用List類的#getAt
1 number[0..2] //[11,12,13] 2 number[1..<3] //[12,13]
類似於前面的String訪問
包含邊界的索引范圍訪問,產生一個新的列表對象
<< 把新元素追加到列表末尾 調用#leftShift
+ 連接兩個列表 調用#plus
- 從列表刪除元素 調用#minus
number[1]=[33,44] 調用#putAt
3.2映射
類似於java的Map
-
訪問 調用#getAt
1 def names=[‘ken’:’Barclay,’John’:’Savage’] 2 def divisors=[4:[2],6:[3,2],12:[6,4,3,2]] 3 names[‘Ken’] //第一種訪問寫法 4 names.Ken //第二種訪問寫法 5 divisors[6]
-
賦值 調用#putAt
1 divisors[6]=[6,3,2,1]
-
聲明
[:] 空映射
如果某個元素的關鍵字是變量,將被解釋成一個String
1 def x=1 2 def y=2 3 def m=[x:y,y:x] //m=['x':2,'y':1]
3.3映射方法
1 def map=['ken':2745,'john':2746,'sally':2742] 2 map.get('david',9999) //9999 3 map.get('sally') //2742 4 map.keySet() //[david,ken,sally,john] 5 mp['ken'] //2745 6 mp.values.asList()
3.4范圍
1 def twentiethCentury=1900..1999 2 def reverseTen=10..1 3 twentiethCentury.size() 4 twentiethCentury.get(0) 5 twentiethCentury.getFrom() 6 twentiethCentury.getTo() 7 twentiethCentury.contains(2000) 8 twentiethCentury.subList(0,5) 9 reverseTen[]2 10 reverseTen.isReverse
4基本輸入和輸出
4.1基本輸出
1 print "My name is" 2 print("MaYiwen") 3 println() 4 //My name is MaYiwen 5 def age=25 6 prinln "My age is:{age}" 7 8 def numbers=[1,2,3,4] 9 def staffTel=['ken':2745,'john':2746,'jessie':2772] 10 println "Numbers:${numbers}" 11 println "Staff telephone:${staffTel}" 12 //Numbers:[1,2,3,4] 13 //Staff telephone:['ken':2745,'john':2746,'jessie':2772]
4.2格式化輸出
1 printf
類似java
5 方 法
5.1 方法
類似js 方法沒有返回值
5.2 方法參數
參數不需要指明類型,只需要在括號中放變量名就可以
1 def methodName(para1,para2,para3){}
5.3 默認參數
方法中的形參可以指定為默認參數
1 def someMethod(para1,para2=0,para3=0){} 2 someMethod方法可以通過一個、兩個或者三個實參調用,至少提供一個實參
5.4 方法返回值
return 可選,省略了,代碼的最后一條語句的值就是方法的返回值
5.5 參數傳遞
值傳遞
類似於java
5.6 作用域
5.7 集合作為參數和返回值
流程控制
6.1 while語句
類似於java
6.2 for語句
類似於java
7類
getter和#setter都是groovy類的隱含方法
1 class Account{ 2 def number 3 def balance 4 } 5 def accounts=[new Account(number:'abc123',balance:1200), 6 new Account(number:'pqr456',balance:200)] 7 accounts.each{acc->println acc}
在java中,account類通常包含初始化類對象的構造器方法。在groovy中並不需要做次工作,只需要使用new操作符和指定的參數即可替代。
在groovy中同樣也有構造器方法。
1 class Account{ 2 def number 3 def balance 4 def Account(number,balance){ 5 this.number=number 6 this.balance=balance 7 } 8 } 9 def accounts=[new Account('abc123',1200),new Account('pqr456',200)] 10 def account=new Account(number:'abc123',balance:1200)//報錯
類似於java,提供構造器會覆蓋默認構造器,所以上面第10行調用默認構造器的代碼報錯