Domanda

What is the Groovy equivalent to the forAll method in OCL?


Let's say that I have a list of items.

def items = new LinkedList<Item>();

What is the Groovy way to express a predicate that holds if and only if all items match a certain criteria?


The following code snippet does not work, because the inner return only jumps out of the current iteration of the each closure, not out of the forAll method.

boolean forAll(def items)
{
    items.each { item -> if (!item.matchesCriteria()) return false; };
    return true;
}

The following code snippet, which should do the trick, feels cumbersome and not Groovy-like.

boolean forAll(def items)
{
    boolean acceptable = true;
    items.each { item -> if (!item.matchesCriteria()) acceptable = false; };
    return acceptable;
}

I am looking for a way to lazily evaluate the predicate, so that the evaluation would finish when a first non-matching item is found.

È stato utile?

Soluzione

You can use every

items.every { it.matchesCriteria() }

Altri suggerimenti

In groovy that's very easy:

def yourCollection = [0,1,"", "sunshine", true,false]

assert yourCollection.any() // If any element is true

or if you want to make sure, all are true

assert !yourCollection.every() 

you can even do it with a closure

assert yourCollection.any { it == "sunshine" } // matches one element, and returns true

or

assert !yourCollection.every { it == "sunshine" } // does not match all elements
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top