我正在尝试计算对象成员中的字符串值。我尝试了三种方法,但只有一种方法有效。我对那个有效的方法很好,但我不明白为什么其他人失败了。这是代码:
void testCount() {
TestObj a = new TestObj()
TestObj b = new TestObj()
TestObj c = new TestObj()
a.s = "one"
b.s = "two"
c.s = "two"
def list = [a, b, c]
def count = 0
list.each{
if (it.s.equals("two"))
count++
}
assertTrue("each test failed", count == 2)
assertTrue("collectAll test failed", list.collectAll{ it.s.equals("two")}.size() == 2)
assertTrue("count test failed", list.count{ it.s.equals("two")} == 2)
}
我希望Closures传递给collectAll并计算我在每个方法中做同样的事情。但是在collectAll的情况下,它返回所有3个对象,在计数的情况下,它总是返回0.
我错过了什么?
答案 0 :(得分:1)
collectAll是recursively遍历您的列表,并返回一个布尔值(因为这是您的闭包为List中的每个元素返回的内容)...
所以,你得到[ false, true, true ]
,它有3个元素......
count
,
list.count{ it.s == "two" }
返回2
(按预期方式)
btw:你可以在groovy中做it.s == 'two'
..不需要所有的.equals( "two" )
class TestObj {
String s
}
list = [ new TestObj( s:'one' ), new TestObj( s:'two' ), new TestObj( s:'two' ) ]
println( list.count { it.s == 'two' } )
为我打印2
...
找到原因(从下面的评论),count didn't accept a closure作为参数直到1.8,所以你将调用object version,它会告诉你闭包的实例存在多少次(没有,正如它所说)