2011-04-26 185 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