Groovy Collections:用字符串计算怪异

时间:2012-01-26 17:16:20

标签: collections groovy

我正在尝试计算对象成员中的字符串值。我尝试了三种方法,但只有一种方法有效。我对那个有效的方法很好,但我不明白为什么其他人失败了。这是代码:

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.

我错过了什么?

1 个答案:

答案 0 :(得分:1)

collectAllrecursively遍历您的列表,并返回一个布尔值(因为这是您的闭包为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 ...

编辑2

找到原因(从下面的评论),count didn't accept a closure作为参数直到1.8,所以你将调用object version,它会告诉你闭包的实例存在多少次(没有,正如它所说)