I am trying to count string values in a member of an object. I have tried three ways, but only one works. I am fine with the one that works, but I can’t understand why the others fail. Here’s the code:
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)
}
I would expect the Closures passed to collectAll and count to do the same thing I’m doing in my each method. But in the case of collectAll it returns all 3 of the objects and in the case of count it always returns 0.
What am I missing?
collectAll is recursively going through your list, and returning a boolean (as that is what your closure returns for each element in the List)…
So, you get
[ false, true, true ], which has 3 elements…For
count,Returns
2(as expected)btw: you can do
it.s == 'two'in groovy.. no need for all the.equals( "two" )Edit… Example for count:
Prints
2for me…edit 2
Found the cause (from comment below), count didn’t accept a closure as a parameter till 1.8 so you’ll be calling the object version which will tell you how many times an instance of the closure exists in the list (which is none, as it says)