Коллекции Groovy: считайте странности со строками - PullRequest
1 голос
/ 26 января 2012

Я пытаюсь посчитать строковые значения в элементе объекта.Я пробовал три способа, но работает только один.Я в порядке с тем, который работает, но я не могу понять, почему другие терпят неудачу.Вот код:

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 объекта, а в случае count он всегда возвращает 0.

Чего мне не хватает?

1 Ответ

1 голос
/ 26 января 2012

collectAll рекурсивно просматривает ваш список и возвращает логическое значение (поскольку именно это возвращает ваше закрытие для каждого элемента в списке) ...

Итак, вы получите [ false, true, true ], который имеет 3 элемента ...

Для count,

list.count{ it.s == "two" }

Возвращает 2 (как и ожидалось)

Кстати: вы можете сделать it.s == 'two' в Groovy .. нет необходимости для всех .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 для меня...

edit 2

Нашли причину (из комментария ниже), счетчик не принял закрытие в качестве параметра до 1,8, поэтому вы будете вызывать версия объекта , которая сообщит вам, сколько раз в списке существует экземпляр замыкания (которого нет, как говорится)

...