我刚刚开始使用Drools(版本5.1.0),所以如果这个问题已经得到解答,请耐心等待。
我有一个java.util.List对象,其中包含复杂类型A的对象,其中A为:
class A {
String name;
String Value;}
列表及其元素位于Drools引擎的工作内存中。只有当列表中元素的名称和值与特定值匹配时,是否有一种简单的方法可以触发规则?
目前,我在Drools规则中使用了一个自定义函数,它在列表上进行迭代,如果有一个符合规范的元素,则返回true,但我不知道这是否是最有效和最简单的用法。
答案 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
...