检查 Drools 列表中的特定元素
Posted
技术标签:
【中文标题】检查 Drools 列表中的特定元素【英文标题】:Check for specific element in a list in Drools 【发布时间】:2012-03-15 02:34:34 【问题描述】:我刚刚开始使用 Drools(5.1.0 版),所以如果这个问题已经得到解答,请多多包涵。
我有一个 java.util.List 对象,其中包含复杂类型 A 的对象,其中 A 为:
class A
String name;
String Value;
列表及其元素都在 Drools 引擎的工作内存中。只有当列表中元素的名称和值与特定值匹配时,是否有一种简单的方法来触发规则?
目前,我在 Drools 规则中使用了一个自定义函数,它遍历列表并在存在与规范匹配的元素时返回 true,但是我想知道这是否是最有效和最简单的用法。
【问题讨论】:
【参考方案1】:如果 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 以与我在写作过程中的基本相同的答案击败我。 @Edson Tirelli 如何跳出循环。说对于每个地址,我有一个返回布尔值的函数;因此我做Person($addresses : addresses); $a : Address() from $addresses; eval($e.returnBoolean());
then //do something;
现在如果在得到评估之后;如果是真的;它do something
然后我想退出循环。我该怎么做?
@Edson Tirelli 你知道我如何在流口水中定义像 $list : List以上是关于检查 Drools 列表中的特定元素的主要内容,如果未能解决你的问题,请参考以下文章