【问题标题】:Understanding Groovy count closures了解 Groovy 计数闭包
【发布时间】:2012-08-13 21:08:59
【问题描述】:

我刚开始使用 Groovy,虽然在 Java 环境中终于可以使用闭包令人耳目一新,但我无法让 count 像我想要的那样工作。

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

public class Foo {

    private boolean isBar;

    public boolean isBar() {
        return isBar;
    }

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

}

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

foos.count { it.isBar() }

或者使用属性表示法,简单地说:

foos.count { it.bar }

但是,这并没有返回预期的结果,它只是返回 0。

我尝试用一​​个简单的 List 整数来测试它。要计算 2 的出现次数,我可以这样做:

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

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

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

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

【问题讨论】:

  • 为我工作,使用 groovy 1.8.4
  • 当然,我使用的是 1.6.0,因为它是一个较旧的项目,但如果升级到 1.8 会有所不同,我会感到惊讶。
  • 你应该让你的Foo类更groovyishclass Foo { boolean bar }(很难让它在评论中看起来不错......)。 Setter/getter 会自动为您服务。

标签: groovy closures


【解决方案1】:

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

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

【讨论】:

  • 谢谢贾斯汀——不敢相信我在文档中错过了这一点。我会尝试升级到 1.8。
  • @Tyler 如果您遇到问题,请尝试先升级到 1.7 版,然后再从那里升级到 1.8。尽管有版本编号,但每次升级都需要进行大量琐碎的代码调整。
【解决方案2】:

Collection.count 1.6 下的文档:

Number count(Object value)

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

因此:

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

Collection.count 1.8 下的文档:

Number count(Object value)

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

Number count(Closure closure)

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

这些文档真的很有帮助。

【讨论】:

    【解决方案3】:

    在 groovy 1.8+ 中你可以这样写:

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

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

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

    【讨论】:

    • count 后面的圆括号是可选的。如果使用,那么它们将包含卷曲夹封闭迭代器执行块。
    • @AlexanderStohr 你在说{括号吗?你能写出结果代码吗?
    • [1, 2, 2, 3].iterator().count( { it == 2 } )
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-26
    • 1970-01-01
    • 1970-01-01
    • 2015-02-09
    • 2016-09-29
    • 1970-01-01
    • 2018-04-30
    相关资源
    最近更新 更多