3

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

述語を怠惰に評価する方法を探しています。これにより、一致しない最初の項目が見つかったときに評価が終了します。

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 に答える