2013-04-26 18 views
0

我最近開始使用Drools,並在編寫drl文件時遇到了這個問題。我正在創建一個「Person」類對象的列表,並將這個列表傳遞給一個.drl文件。現在我想迭代列表來檢查「薪水」大於某個值的人員(Person類的對象)。但是因爲把集合放在工作記憶中是一種不好的做法,是否可以不用迭代呢?在drools中是否可以對傳遞給drl文件的java列表應用規則而不將這個列表放入工作內存?

回答

2

迭代是Drools規則固有的。這是命令式語言中規則和if語句之間的區別之一。規則將針對每個對象進行評估(這不是100%準確; Drools比你的工作記憶更聰明)。

因此,如果您將每個人的對象爲在會話中一個事實,你只需要有1個規則做你需要的東西:

rule 'Check Person Salary' 
when 
    $p: Person(salary > 1000) 
then 
    //do whatever you want with $p 
end 

每次插入一個Person對象時,規則將被評估。如果對象通過評估,則會生成該規則的新激活。 當你調用fireAllRules()時,所有的激活都將被執行:激活的規則的RHS將被執行。當然,這大致說明了Drools和RETE算法的工作原理。有關更加精確的信息,請參閱Drools文檔。

希望它有幫助,

+0

非常感謝埃斯特萬。現在假設我一次插入一個Person對象而不是一個Person對象的列表(如你所解釋的)。是否有可能迭代這個列表中的單個元素,並在元素上應用規則而不將列表放入工作內存中? – user2323379 2013-04-26 11:55:53

+0

如果你不想將列表放在工作內存中,那麼你必須迭代你的java代碼並對它的每個元素進行一次insert()調用。 – 2013-04-26 12:46:37

+0

行..好吧。謝謝埃斯特班。 – user2323379 2013-04-29 05:48:53

相關問題