3

我刚开始使用 Groovy,虽然最终在 Java 环境中可以使用闭包令人耳目一新,但我在count按自己的意愿工作时遇到了问题。

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

public class Foo {

    private boolean isBar;

    public boolean isBar() {
        return isBar;
    }

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

}

现在假设我有一个List实例Foo,并且我想计算为真的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 }

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

4

3 回答 3

4

根据Groovy,JDK Collection#count(Closure)直到 1.8.0 才添加。你可以试试#sum

assert [1, 2, 2, 3].sum() { it == 2? 1 : 0 } == 2
于 2012-08-13T21:28:56.150 回答
2

Collection.count1.6以下的文档:

Number count(Object value)

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

因此:

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

Collection.count1.8 以下的文档:

Number count(Object value)

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

Number count(Closure closure)

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

文档真的,真的很有帮助。

于 2012-08-13T21:29:10.727 回答
1

在 groovy 1.8+ 中,您可以编写:

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

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

public static Number count(Iterator self, Closure closure) {
于 2014-02-26T20:27:00.390 回答