規則引擎集合相關處理
在實際生產過程中,有很多關於集合的處理場景,比如一個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/2019/07/31/drools規則引擎-如果判斷某個對象中的集合是否包含指/