我刚刚开始使用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 }
后者似乎也没有返回预期的结果。我所做的研究似乎表明我所做的是正确的,但显然不是。使用它的正确方法是什么?
答案 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) {