2019獨角獸企業重金招聘Python工程師標準>>>
list轉換為數組
List list = ['a','b','c','d'] def strs = list as String[] println strs[0]
使用了Groovy語言,就能時不時的感受到Groovy語言在編碼風格上與Java語言的不同。當然,我們首先感受到的可能就是在Groovy語言中無處不在的閉包,其中最最常用的是each方法。
比如,下面的代碼段是我們在Java語言中常用的遍歷風格:
for(int?i=0;i<list.size();i++)
{System.out.println(list.get(i));
}
但是,我們在Groovy語言中常用的遍歷風格卻是如下的代碼段:
??? ? list.each{
?????? ??println?it
? }
?
這種風格,已經讓我強烈感受到了Groovy語言編碼的快捷性。但是,我們,對于長期使用Java語言的我們來說,Groovy語言在許許多多的地方表現出它的風格,但我們由于使用Java語言的慣性,未必能很自然的使用它們。
比如,我們有如下的一個集合對象:
?
??? ??def?list = [1,2,3,4]
?
現在,我們需要得到一個集合對象,它的每一個元素是上面的list對象的每一個元素的兩倍。我們從Java語言過來的人很容易寫出如下的代碼來:
?
??? ??def?result = []
??? ?
??? ? list.each{
?????? ? result << it*2
??? ? }
?
我們可能會洋洋自得,我們的each方法使用的不錯,代碼比起Java語言來簡單得多了。但實際上,Groovy語言為我們準備了更加簡單的方法,這就是Groovy語言風格的集合方法--collect方法。
?
??? ??def?result = list.collect{it*2}
?
可以看到,只有一個語句行,就代替了上面的三個語句行。這就是我們Groovy風格的代碼,同樣的方法還有"collect
(Collection?collection,?Closure?closure)
","collectAll
(Closure?closure)
"和"collectAll
(Collection?collection,?Closure?closure)
"。
?
還是上面的list對象,比如,我們想找出該對象中所有大于2的元素來,我們的Java語言風格應該是這樣的:
??? ?
??? ??def?result = []
?
??? ? list.each{
???????????if(it>2)
????????????? result << it
?????? }
?
???????println?result
???
?
但是,這種過濾,在Groovy語言中,同樣可以找到集合方法來代替它,使得代碼更加具有Groovy語言風格:
???
?
???????def?result = list.grep{
?????????? it > 2
?????? }
?
????println?result
?
是的,在Groovy語言中,我們對集合元素的過濾一般都使用"grep"方法,這樣的代碼更加具有Groovy風格一些。具有同樣一些功能的方法還有"find
(Closure?closure)
","findAll
(Closure?closure)
"。
?
在Java語言中,對List的遍歷方法是萬能的,我們要做的一切功能都必須從遍歷方法開始。比如,我們想知道上面的list對象是否所有的元素都大于0。在Java語言中,我們會寫出如下的代碼:
?
???????boolean?isMoreThanZero =?true;
?
???????for(int?i?in?list)
?????? {
???????????if(i<=0)
?????????? {
????????????? isMoreThanZero =?false;
??????????????break;
?????????? }
?????? }
??????
????println?isMoreThanZero
?
在Groovy語言中,同樣有Groovy風格的方法來幫我們省掉一大段的代碼,這就是"every"方法:
?
???????def?isMoreThanZero = list.every{
?????????? it>0
?????? }
??????
????println?isMoreThanZero
?
同樣類型的方法還有"any
(Closure?closure)
","any
()
"和"every
()
"。
?
除了上面的一些Groovy風格的代碼,我們還有難度更大一些的Groovy語言風格的方法,比如注入方法--"inject"。
比如,我們想把list對象的所有元素相加起來,然后再和10求和。Java語言的編碼風格看起來如下:
?
???????def?count?= 10
??????
?????? list.each{
???????????count+=it
?????? }
?
????println?count
?
但Groovy語言風格的代碼看起來如下所示:
?
???????def?count?= list.inject(10){result,it->
?????????? result+it
?????? };
?
????println?count
?
類似這樣的注入方法,Groovy語言還有集合方法"count
(Object?value)
"。
?
還有一個集合方法,對于字符串特別好用。比如,我們想把上面的list對象的所有元素連接成一個字符串。Java語言的風格是這樣的:
?
???????def?result = ''
??????
?????? list.each{
?????????? result+=it
?????? }
?
???????println?result
???
Groovy語言風格的代碼則是如下:
?
???????def?result = list.join()
?
???????println?result
???
?
好了,就舉出這么多了,都是一些集合方法配合閉包來使用而形成的Groovy語言風格的代碼,寫起來既快捷又簡約,體現出Groovy語言作為動態語言的特點來。