与OCL中的forAll方法等效的Groovy是什么?
假设我有一个项目列表。
def items = new LinkedList<Item>();
当且仅当所有项都符合特定条件时,Groovy表达谓词的方式是什么?
以下代码片段不起作用,因为内部返回只跳出每个闭包的当前迭代,而不是跳出forAll方法。
boolean forAll(def items)
{
items.each { item -> if (!item.matchesCriteria()) return false; };
return true;
}
以下代码片段应该可以解决这个问题,感觉很麻烦而且不像Groovy。
boolean forAll(def items)
{
boolean acceptable = true;
items.each { item -> if (!item.matchesCriteria()) acceptable = false; };
return acceptable;
}
我正在寻找一种方法来懒惰地评估谓词,以便在找到第一个不匹配的项目时完成评估。
答案 0 :(得分:6)
您可以使用every
items.every { it.matchesCriteria() }
答案 1 :(得分:3)
在groovy中这很容易:
def yourCollection = [0,1,"", "sunshine", true,false]
assert yourCollection.any() // If any element is true
或者如果你想确定,一切都是真的
assert !yourCollection.every()
你甚至可以用一个闭包
来做assert yourCollection.any { it == "sunshine" } // matches one element, and returns true
或
assert !yourCollection.every { it == "sunshine" } // does not match all elements