规则引擎集合相关处理
在实际生产过程中,有很多关于集合的处理场景,比如一个 Fact 对象中包含有一个集合,而需要判断该集合是否包含某个值。而 Drools 规则引擎也提供了多种处理方式,比如通过 from、contains、exists 等进行操作,比较。
当然也可以通过 function 函数来做相应的比较,在个在其他章节讲到过,就不在此赘述。下面重点以几个实例才进行讲解,在具体实践中根据具体情况来进行运用。
实例
省略掉基本的配置,直接看调用代码和规则代码。
测试调用代码:
public class ContainsDemo extends BaseDemo {public static void main(String[] args) {KieSession kieSession = getKieSession("containsVar");
Corporation corporation = new Corporation();
Set<Scope> scopes = new HashSet<>();
scopes.add(new Scope("P2P"));
scopes.add(new Scope("金融"));
scopes.add(new Scope("区块链"));
corporation.setScopes(scopes);
Scope scope = new Scope("区块链");
kieSession.insert(corporation);
kieSession.insert(scope);
kieSession.fireAllRules();}
}
相关实体类:
@Data
public class Corporation {private Set<Scope> scopes;}
@Data
public class Scope {public Scope(String scope){this.scope = scope;}
private String scope;
}
然后看一下规则处理:
package com.containsVar
import com.secbro2.drools.entity.Corporation
import com.secbro2.drools.entity.Scope
import java.util.List
rule "containsVar1"
when
$c: Corporation($scopes:scopes);
$s: Scope(scope == "P2P") from $scopes;
then
System.out.println("containsVar1 行业类型为:P2P");
end
rule "containsVar2"
when
$c: Corporation($scopes:scopes);
exists (Scope(scope == "P2P") from $scopes);
then
System.out.println("containsVar2 行业类型为:P2P");
end
rule "containsVar3"
when
$s: Scope(scope == "区块链")
$c: Corporation(scopes contains $s);
then
System.out.println("containsVar3 行业类型为:区块链");
end
rule "containsVar4"
when
$s: Scope(scope == "区块链")
exists (Corporation(scopes contains $s));
then
System.out.println("containsVar4 行业类型为:区块链");
end
在上述实例中列举了 4 中使用方法:
- 第一种,首先获取 Fact 对象 Corporation,并重新定义了它的属性 $scopes。然后,通过 from 关键字来遍历 $scopes 中的值,获得符合条件的。此时并不需要传入 Scope 对应的 fact 对象。
- 第二种,前半部分同第一种方式,是不过没有获取筛选的结果,直接用 exists 来判断是否存在。
- 第三种,先获得满足条件的 Scope 的 Fact 对象,然后再利用此 fact 对 Corporation 的 fact 对象进行筛选,只有满足条件才可以继续。
- 第四种,与第三种效果相同,原理同第二种方式的 exists 使用。
相关技术视频
CSDN 学院:《Drools7 规则引擎进阶教程》
CSDN 学院:《Drools7 规则引擎入门教程》
CSDN 学院:《Drools7 系列优惠套餐》
原文链接:http://www.choupangxia.com/20…