Groovy探索 使用集合方法,寫出更加Groovy風格的程式碼

hivon發表於2009-03-17

 

            Groovy探索 使用集合方法,寫出更加Groovy風格的程式碼

 

 

使用了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語言作為動態語言的特點來。

相關文章