检查Drools中列表中的特定元素

时间:2012-02-24 16:20:12

标签: java drools rule-engine

我刚刚开始使用Drools(版本5.1.0),所以如果这个问题已经得到解答,请耐心等待。

我有一个java.util.List对象,其中包含复杂类型A的对象,其中A为:

class A {
  String name; 
  String Value;}

列表及其元素位于Drools引擎的工作内存中。只有当列表中元素的名称和值与特定值匹配时,是否有一种简单的方法可以触发规则?

目前,我在Drools规则中使用了一个自定义函数,它在列表上进行迭代,如果有一个符合规范的元素,则返回true,但我不知道这是否是最有效和最简单的用法。

1 个答案:

答案 0 :(得分:15)

如果你说的A实例在工作内存中(理想情况),只需用它编写规则:

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

不建议直接将集合(列表,树等)插入到工作内存中,因为它们是抽象的数据结构,没有任何内在的语义附加。但是,假设您有一个Person类,其中包含地址列表,并且您希望在加拿大蒙特利尔执行每个地址的规则,而不将地址本身作为fac插入。你可以写:

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
...