【问题标题】:Check for specific element in a list in Drools检查 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,但是我想知道这是否是最有效和最简单的用法。

【问题讨论】:

    标签: java drools rule-engine


    【解决方案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)
    猜你喜欢
    • 2011-07-03
    • 2021-09-25
    • 1970-01-01
    • 2015-12-27
    • 1970-01-01
    • 2021-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多