java - Drools:匹配规则 LHS 中数组中的本地字符串

标签 java drools

我正在尝试创建规则,在其中检查某个字符串是否位于我的规则的 LHS 的字符串列表中。要比较的字符串列表是恒定的并且在创建规​​则时已知,但在许多类似规则之间有所不同。

示例规则如下(我现在编写它们的方式):

rule "ruleX"
when
    $a: MyObject() 
then
    List<String> list = new ArrayList<String>();
    list.add("ABC");
    list.add("DEF");

    if (list.contains($a.getString()) {
        //do stuff
    }
end

这不会利用 PHREAK 引擎中存在的一些优化,因为 RHS 中完成的工作可用于通过 LHS 区分规则。

“列表”的内容因许多类似规则而异。有一个更好的方法吗?我无法想象 LAN 数据库调用会更快。

最佳答案

这可以简单地重写为:

rule "ruleX"
when
    MyObject( string in ("ABC", "DEF") ) 
then
    //do stuff
end

请注意,in 之后的列表也可以包含(以前的)绑定(bind)变量。

如果集合中有值,也可以这样写

rule "ruleY"
when
    Data( $los: listOfStrings )
    MyObject( string memberOf $los ) 
then
    //do stuff
end
rule "ruleY"
when
    MyObject( $s: string ) 
    Data( listOfStrings contains $s )
then
    //do stuff
end

如果列表可以从某个地方(例如数据库)提取并包装到合适的事实中,以便预先插入,这可能会更好。

请注意,Drools 引用手册中详细记录了技术细节。

关于java - Drools:匹配规则 LHS 中数组中的本地字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30989374/

相关文章:

java - 使用 Drools 规则进行实体验证

java - Drools 规则中的运算符优先级

java - 使用 OpenSSL 的多个连接

java - 打开通知时如何更新 Activity

java - 使用 Retrofit android 进行 Curl

java - 在 httpclient.execute 中的 HttpClientConnectionOperator.connect 时忽略套接字读取超时

java - 重用部分 Drools `when` 语句

java - 什么是 Drools Kie?

java - 使用 Joda Time 将 Unix 时间戳转换为字符串

java - DROOLS 如果条件之一不匹配则停止评估