3

什么是与 OCL 中的 forAll 方法等效的 Groovy?


假设我有一个项目列表。

def items = new LinkedList<Item>();

当且仅当所有项目都符合特定条件时,表达谓词的 Groovy 方法是什么?


下面的代码片段不起作用,因为内部返回只是跳出each闭包的当前迭代,而不是跳出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;
}

我正在寻找一种懒惰地评估谓词的方法,以便在找到第一个不匹配项时完成评估。

4

2 回答 2

6

你可以使用每一个

items.every { it.matchesCriteria() }
于 2012-08-18T12:25:15.830 回答
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
于 2012-08-18T12:28:55.140 回答