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

ser*_*ena 10 java rule-engine drools

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

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

class A {
  String name; 
  String Value;}
Run Code Online (Sandbox Code Playgroud)

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

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

Eds*_*lli 16

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

rule X
when
    A( name == "bob", value == 10 )
...
Run Code Online (Sandbox Code Playgroud)

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

rule X
when
    Person( $addresses : addresses )
    Address( city == "Montreal", country == "CA" ) from $addresses
...
Run Code Online (Sandbox Code Playgroud)

最后,如果您真的想将列表本身用作事实(再次,不好的做法),您可以执行以下操作,但请注意它将匹配工作内存中的所有列表:

rule X
when
    $list : List()
    A( name == "bob", value == 10 ) from $list
...
Run Code Online (Sandbox Code Playgroud)