1.實(shí)現(xiàn)循環(huán)的方式
1.for in
for(i in 0..2){
print 'hello world'
}
- upto
0.upto(2){
print '$it'
}
3.times
3.times{
print '$it'
}
安全導(dǎo)航操作符
1.null檢查處理
def foo(str){
str?.reverse()
}
println foo('evil')
println foo(null)
輸出結(jié)果為
live
null
使用?.在空引用上調(diào)用reverse(),其結(jié)果產(chǎn)生了一個(gè)null,而沒有拋出空指針異常
基礎(chǔ)語法
1.return語句總是可選的
int add(a,b){
a+b
}
等同于
int add(a,b){
return a+b
}
2.分號(hào)分隔語句總是可選的
3.方法和類默認(rèn)為public
4.?.操作符只有對(duì)象引用不為空時(shí)才分派調(diào)用
5.函數(shù)引用可以不加()
def variable1 = 1 //可以不使用分號(hào)結(jié)尾
def varable2 = "友盟分享"
int x = 1 //變量定義時(shí),也可以直接指定類型
println 'hello world' //引用println函數(shù)
String
1.單引號(hào)''中的內(nèi)容嚴(yán)格對(duì)應(yīng)Java中的String,不對(duì)$符號(hào)進(jìn)行轉(zhuǎn)義
defsingleQuote='I am $ dolloar' //輸出就是I am $ dolloar
2.雙引號(hào)""的內(nèi)容則和腳本語言的處理有點(diǎn)像,如果字符中有$號(hào)的話,則它會(huì)$表達(dá)式先求值。
def aaa = "aaa" //輸出aaa
def x = 1
def result = "I am $x person" //輸出I am 1 person
3.三個(gè)引號(hào)'''xxx'''中的字符串支持隨意換行 比如
defmultieLines = ''' begin
line 1
line 2
end '''
函數(shù)
1.可選形參
def log(x,base=10){
x*base
}
println 11
println 11,100
println 100,10
如輸出結(jié)果所示,Groovy使用可選形參填充了缺失的實(shí)參
110
1100
1000
2.多賦值
def spilteName(fullName){fullName.spilt(' ')}
def(firstName,secondName) = spilteName('James Bond')
println "$secondName $firstName $secondName"
如輸出所示
Bond James Bond
動(dòng)態(tài)類型
1.靜態(tài)類型
def takeHelp(Man man){
man.help()
}
class Man{
def help(){
println 'man help'
}
}
2.動(dòng)態(tài)類型
def takeHelp(man){
man.help()
}
class Man{
def help(){
println 'man help'
}
}
class Women{
def help(){
println 'women help'
}
}
class Elephant{
def help(){
println 'elephant help'
}
}
下面調(diào)用takeHelp()
takeHelp(new Man())
takeHelp(new Women())
takeHelp(new Elephant())
如下輸出所示
man help
women help
elephant help
閉包
def pikeEven(n,block){
for(int i=2;i<n:i+=2){
block(i)
}
}
pickEvent(10){number-> println(number)}
容器類
Groovy中的容器類很簡(jiǎn)單,就三種:
List:鏈表,其底層對(duì)應(yīng)Java中的List接口,一般用ArrayList作為真正的實(shí)現(xiàn)類。
Map:鍵-值表,其底層對(duì)應(yīng)Java中的LinkedHashMap。
Range:范圍,它其實(shí)是List的一種拓展。
下面會(huì)舉一些例子:
List
def aList = [5,'string',true] //List由[]定義,其元素可以是任何對(duì)象
變量存取:可以直接通過索引存取,而且不用擔(dān)心索引越界。如果索引超過當(dāng)前鏈表長度,List會(huì)自動(dòng)
往該索引添加元素
assert aList[1] == 'string'
assert aList[5] == null //第6個(gè)元素為空
aList[100] = 100 //設(shè)置第101個(gè)元素的值為10
assert aList[100] == 100
那么,aList到現(xiàn)在為止有多少個(gè)元素呢?
println aList.size ===>結(jié)果是101
Map
def aMap = ['key1':'value1','key2':true]
/*Map由[:]定義,注意其中的冒號(hào)。冒號(hào)左邊是key,右邊是Value。key必須是字符串,value可以是任何對(duì)象。另外,key可以用''或""包起來,也可以不用引號(hào)包起來。比如 */
def aNewMap = [key1:"value",key2:true]//其中的key1和key2默認(rèn)被
處理成字符串"key1"和"key2"
/*不過Key要是不使用引號(hào)包起來的話,也會(huì)帶來一定混淆,比如 */
def key1="wowo"
def aConfusedMap=[key1:"who am i?"]
/*aConfuseMap中的key1到底是"key1"還是變量key1的值“wowo”?顯然,答案是字符串"key1"。如果要是"wowo"的話,則aConfusedMap的定義必須設(shè)置成: */
def aConfusedMap=[(key1):"who am i?"]
/*Map中元素的存取更加方便,它支持多種方法: */
println aMap.keyName // <==這種表達(dá)方法好像key就是aMap的一個(gè)成員變量一樣
println aMap['keyName']// <==這種表達(dá)方法更傳統(tǒng)一點(diǎn)
aMap.anotherkey = "i am map" //<==為map添加新元素
Rang
def aRange = 1..5 //<==Range類型的變量 由begin值+兩個(gè)點(diǎn)+end值表示左邊這個(gè)aRange包含1,2,3,4,5這5個(gè)值 如果不想包含最后一個(gè)元素,則
def aRangeWithoutEnd = 1..<5 //<==包含1,2,3,4這4個(gè)元素
println aRange.from
println aRange.to