2012-02-24 41 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

相关问题