Groovy相当于OCL forAll

时间:2012-08-18 12:06:44

标签: groovy ocl

与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;
}

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

2 个答案:

答案 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