Groovy元素比较

时间:2011-04-26 04:41:29

标签: groovy groovyshell

这是疯了,还是这个斯巴达?

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. 为什么这不起作用?

2 个答案:

答案 0 :(得分:3)

请注意方法签名

public Number count(Closure closure)
自Groovy 1.8.0(当前产量为1.7.10)支持

- 请参阅http://groovy.codehaus.org/groovy-jdk/java/util/Collection.html#count(groovy.lang.Closure)

在Groovy 1.8之前,上面的代码调用方法'count(Object value)',它计算集合中给定值的出现次数。提供闭包实例作为实际参数'value'会导致上述结果。

答案 1 :(得分:3)

  

什么是惯用的Groovy方法(上面计算x!=某个元素的元素数量)

这是一种方式:

def list = [3, 5, 3]

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