2012-02-24 47 views
10

我剛開始使用Drools(版本5.1.0),因此如果此問題已得到解答,請耐心等待。檢查Drools中的列表中的特定元素

我有一個包含複雜類型A的對象,用A作爲java.util.List對象:

class A { 
    String name; 
    String Value;} 

列表以及其元素在Drools的引擎的工作存儲器中。只有列表中元素的名稱和值與特定值匹配時,是否有簡單的方法才能激發規則?

目前,我在Drools規則中使用了一個自定義函數,該函數在列表上進行迭代,如果有符合規範的元素則返回true,但是我想知道這是否是最有效和最簡單的用法。

回答

14

如果A實例是在工作記憶就像你說的(理想的情況下),只是用它編寫規則:

rule X 
when 
    A(name == "bob", value == 10) 
... 

插入集合(列表,樹等)進入工作記憶是直接不推薦,因爲它們是抽象的數據結構,沒有任何內在的語義附加。但是可以說你有一個Person類,它包含一個地址列表,並且你希望爲加拿大蒙特利爾的每個地址執行規則,而不用將地址本身作爲facs。你可以寫:

rule X 
when 
    Person($addresses : addresses) 
    Address(city == "Montreal", country == "CA") from $addresses 
... 

最後,如果你真的想用列表本身作爲一個事實(同樣,不好的做法),你可以做到以下幾點,但請注意,它會匹配在工作內存中的所有表:

rule X 
when 
    $list : List() 
    A(name == "bob", value == 10) from $list 
... 
+1

+1打了我一拳基本上相同的答案我正處於寫作中。 – mike9322 2012-02-24 17:42:58

+0

感謝您的回答 – serena 2012-02-24 22:43:12

+0

@Edson Tirelli如何擺脫循環。 說每個地址,我有一個函數返回我布爾值;因此我做 '人($地址:地址); $ a:來自$地址的地址(); eval($ e.returnBoolean());' '然後//做某事;' 現在如果在得到eval之後;如果這是真的;它'做些什麼',然後我想離開循環。我該如何解決這個問題? – Kraken 2012-11-22 09:38:10