了解Groovy计数闭包

时间:2012-08-13 21:09:00

标签: groovy closures

我刚刚开始使用Groovy,虽然最后在Java环境中使用闭包令人耳目一新,但是我遇到了让count按照我想要的方式工作的问题。

假设我有一个类Foo看起来像这样:

public class Foo {

    private boolean isBar;

    public boolean isBar() {
        return isBar;
    }

    public boolean setIsBar(boolean isBar) {
        this.isBar = isBar;
    }

}

现在假设我有ListFoo个实例,我想计算Foo个为isBar的对象的数量。我期待它看起来像这样:

foos.count { it.isBar() }

或使用属性表示法,只需:

foos.count { it.bar }

但是,这不会返回预期结果,只会返回0.

我尝试使用简单的List整数进行测试。要计算2的出现次数,我可以这样做:

[1, 2, 2, 3].count(2)

但我不应该使用闭包来执行以下操作吗?

[1, 2, 2, 3].count { it == 2 }

后者似乎也没有返回预期的结果。我所做的研究似乎表明我所做的是正确的,但显然不是。使用它的正确方法是什么?

3 个答案:

答案 0 :(得分:4)

根据Groovy JDK Collection#count(Closure)直到1.8.0才添加。您可以尝试使用#sum

assert [1, 2, 2, 3].sum() { it == 2? 1 : 0 } == 2

答案 1 :(得分:1)

1.6下的Collection.count文档:

  

Number count(Object value)

     

计算此集合中给定值的出现次数

因此:

> [1, 2, 2, 3].count(2)
2

1.8下的Collection.count文档:

  

Number count(Object value)

     

计算此集合中给定值的出现次数。

     

Number count(Closure closure)

     

计算从此集合中满足给定闭包的出现次数。

文档确实非常有用。

答案 2 :(得分:0)

在groovy 1.8+中你可以写:

[1, 2, 2, 3].iterator().count { it == 2 }

由于向后兼容性,DefaultGroovyMethods的新方法签名是:

public static Number count(Iterator self, Closure closure) {