2011-04-26 126 views
1

這是瘋狂還是斯巴達?Groovy元素比較

groovy:000> b = [1,2,3,4] 
===> [1, 2, 3, 4] 
groovy:000> b.count { !it.equals(4) } 
===> 0 
groovy:000> b.count { !it == 4 }  
===> 0 
groovy:000> b.count { it == 4 } 
===> 0 
groovy:000> b.count { it == 1 } 
===> 0 
groovy:000> b[0] 
===> 1 
groovy:000> b.each { println it } 
1 
2 
3 
4 
===> [1, 2, 3, 4] 
groovy:000> print b.class 
class java.util.ArrayList===> null 
groovy:000> b.each { println it.class } 
class java.lang.Integer 
class java.lang.Integer 
class java.lang.Integer 
class java.lang.Integer 
===> [1, 2, 3, 4] 
groovy:000> 4.equals(b[3]) 
===> true 
groovy:000> 

我在這裏遇到了一個「驚訝的期望」的例子。 Groovy告訴我,我有一個Integer的ArrayList,我希望我能夠像上面的3個查詢一樣簡單而甜美地進行可愛的小搜索。但不是。

  1. 是什麼做上述的慣用方式的Groovy(計數元素的數量,其中x!=一些元素)
  2. 爲什麼不工作的呢?既然Groovy的1.8.0方法簽名

    public Number count(Closure closure) 
    

    支持

回答

3

知道(目前生產的是1.7.10) - 見http://groovy.codehaus.org/groovy-jdk/java/util/Collection.html#count(groovy.lang.Closure)

的Groovy 1.8之前,上面的代碼中調用方法'count(Object value)',它計算集合內給定值的出現次數。提供閉合實例作爲實際參數「值」導致上述結果。

+0

順便說一句:「!它== 4「將始終返回false,應該寫爲」it!= 4「 – 2011-04-26 06:33:44

+0

+1,以獲得良好的解釋並捕獲一些不好的語義j0j0。 – 2011-04-26 17:55:42

3

是什麼做上述的慣用Groovy的方式(計數元素的數量,其中x =一些元素!)

這裏有一種方法:

def list = [3, 5, 3] 

def countElementsNotEqualTo3 = list.findAll{ it != 3 }.size() 
assert countElementsNotEqualTo3 == 1 
+0

對於這樣一種簡潔的語言,這看起來有點冗長,但它確實符合要求。 – 2011-04-26 17:55:01