首页 文章

了解Groovy计数闭包

提问于
浏览
1

我刚刚开始使用Groovy,虽然它在's refreshing to finally have closures to work with in a Java environment, I'有问题让 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

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

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

    1.6下的 Collection.count 文档:

    Number count(Object value)计算此集合中给定值的出现次数

    从而:

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

    Collection.count 的文档在1.8以下:

    Number count(Object value)计算此集合中给定值的出现次数 . 数量计数(闭包闭包)计算从此集合中满足给定闭包的出现次数 .

    文档确实非常有用 .

  • 4

    在groovy 1.8中你可以写:

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

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

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

相关问题