由于工作需要,今天看了看Groovy,下面是學(xué)習(xí)過程的學(xué)習(xí)筆記:
基本原則:Java完全可以調(diào)用Groovy寫好的類;Groovy完全可以調(diào)用Java寫好的類;即使不使用Groovy的特有的語法,可以使用Java中的絕大部分傳統(tǒng)寫法。
1 如果使用 groovy.lang.*,grooby.util.*,java.lang.*,java.util.*,java.net.*中的類的時候無需import。
2、支持assert,比如assert 1==1,assert(true)
更高級的用法:assert('text'.3<<'hello').size==4*3+5
3、groovy支持弱類型聲明def x=1
4、GroovyBean
class Book
{
String title;//聲明的是屬性,而非字段
}
def g = new Book()
print g.title
print g.getTitle()
5 groovy中的==表示等于(equality),而非同一(identity),這與java不同。
6 def nick = 'Gina'
def book = 'Groovy'
assert '$nick is $book' = 'Gina is Groovy'
7 使用正則判斷字符串匹配:assert '12345'=~/\d+/
8 groovy中可以直接對Integer類型使用四則運算,可以對int類型調(diào)用toString方法。
9 使用list:
def r =['a','b','c']
assert r[0]='a'
assert r.size()==9
使用map:
def http=[100:"cont",200:'ok']
assert http[200]=='ok'
http[800]='what?'
使用ranges:
def x=1..10
assert x.contains(5)
10 閉包:
(1)[1,2,3].each{entry->println entry}
(2)累加計算:其中upto表示從1遍歷到10
def counter=0
1.upto(10)
{
number->
counter = counter+number
}
println counter
11 動態(tài)執(zhí)行:evaluate('1+2') 會打印出3
12 groovy中類型可以弱類型聲明,也可以強類型聲明,并且聲明的時候會自動進行boxing,比如def a=1是可以的,int a=1也是可以的,而且第二種用法中聲明的a是Integer類型的。
13 Groovy支持運算符重載,其實現(xiàn)方式和python類似,也就是類只要實現(xiàn)某個方法即可實現(xiàn)運算符重載,下面是運算符和對應(yīng)方法:+ plus;- minus;* multiply;/ div;% mod;++ next;-- previous;** power;| or;& and;^ xor;~ negate;a[b] a.getAt(b);a[b] = c a.putAt(b,c);a<<b a.leftShift(b);a>>b a.rightShift(b);a>>>b a rightShiftUnsigned(b);
switch(a){case b:} b.isCase(a);a==b a.equals(b);
a<=>b a.compareTo(b);
a>b a.compareTo(b)>0;
a>=b a.compareTo(b)>=0;
a<b a.compareTo(b)<0;
a<=b a.compareTo(b)<=0;
a as type a.asType(typeClass)
14 字符串操作:
g="Hello Grooby!"
assert g[6..11] == 'Groovy'
assert g.count('0')==3
assert 'x'.padLeft(3)==' x'
assert 'x'.padRight(3,'_')=='x__'
assert 'x'.center(3)==' x '
assert 'x'*3=='xxx'
15 字符串的LeftShift和切片的應(yīng)用
g='Hello'
g<<' Groovy'
assert g instanceof java.lang.StringBuffer
g<<'!'
assert g.toString()=='Hello Groovy!'
g[1..4] = 'i'//替換ello為i,切片的典型應(yīng)用
assert g.toString()=='Hi Grooby!'
list等collection類型同樣支持切片
16 數(shù)字的方法:
def s = ''
10.times{s+='x'}
10.downto(0){x+='d'}
s=''
0.step(0.5,0.1){number->
s+=number+' '
}
assert s=='0 0.1 0.2 0.3 0.4'
17 List的常見操作
assert [1,[2,3]].flattern()==[1,2,3]//扁平化
assert [1,2,3].intersect([4,3,1])==[3,1]//交集
assert [1,2,3].disjoint([4.5,6])
list = [1,2,3]
assert list.pop()==3//像使用堆棧一樣
assert [3,1,2].sort()==[1,2,3]
assert [1]==[1,1,1].unique()//去掉重復(fù)元素
def list=[1,2,3]
assert list.count(2)==1
assert list.max()==3
assert list.min()==1
def even = list.find{item->
item%2==0
}
assert even ==2
assert list.every{item->
item<5
}//所有的都小于5
assert list.any{item->
item<2
}//任何一個小于5
list.reverseEach{item->
store+=item
}//反向遍歷
assert [1,2,3].join('-')=='1-2-3'
for(i in [1,2,3])
{
println i
}
18 文件處理:
new File('a.txt').eachLine{println it}
19 groovy中xml處理非常簡單,可以參考blogjava上的一篇名為“Groovy高效編程——生成XML文件”的文章。
20 Groovy中使用Swing構(gòu)建界面:
import grooby.swing.SwingBuilder
swing = new SwingBuilder()
frame = swing.frame(titile:'Demo'){
menuBar{
menu('File'){
menuItem 'New'
menuItem 'Open'
}
}
panle{
label 'Label my'
slider()
comboBox(items:['1','2','3'])
}
}
frame.pack()
frame.show()
21 groovy中簡化了jdbc訪問數(shù)據(jù)庫的方法,提供了execute、eachRow等方法,無需開發(fā)人員關(guān)心關(guān)閉連接等問題。
22 java中運行g(shù)rooby腳本的方法:
GroovyShell shell = new GroovyShell()
Object result = shell.evaluate("12+23")
23 Groovy解析引擎的類為GroovyScriptEngine
def engine = new GroovyScriptEngine(".")
def value = engine.run("test/MyScript.grooby",new Binding())