检查 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() 这样的东西吗? 你不能。 Java 擦除会删除类型信息,因此无法执行此操作。这是 JVM 限制。更多细节在这里:docs.oracle.com/javase/tutorial/java/generics/erasure.html 嗨@EdsonTirelli 可以告诉我如何访问列表中的每个项目,例如我定义 $list : List() 但我想将每个值发送到一个函数。例如 :function (return variable + "checked") when (select list send each value to function from list) then (write returned function value)

以上是关于检查 Drools 列表中的特定元素的主要内容,如果未能解决你的问题,请参考以下文章

如何检查特定元素中是不是有值或其他类?

Python 列表中下一个最近的特定项目(向前)并检查

scala drools and map

检查列表框中的所选项是否包含特定字符

检查一个列表元素中的元素是不是存在于另一个列表中

如何检查列表中的任何一个元素是不是显示在量角器中