問題場景
在使用Drools規(guī)則引擎時,有朋友會遇到這樣的問題,就是在when部分判斷的兩個參數(shù)都是集合類型山叮,比如兩個List,此時要判斷一個集合是否包含另外一個集合的內(nèi)容添履。
拿一個具體的例子來說明屁倔,我的公眾號《程序新視界》接受商務(wù)合作有一定的要求,設(shè)置了對應(yīng)行業(yè)的黑名單暮胧,比如:房地產(chǎn)锐借、游戲和P2P領(lǐng)域的合作不接。
那么此時往衷,有一個廣告商準(zhǔn)備投放廣告钞翔,而它投放的廣告領(lǐng)域涵蓋了教育和P2P,那么席舍,在進(jìn)行規(guī)則篩選時就出現(xiàn)了要判斷提供的集合中的元素是否包含在被排除領(lǐng)域里面布轿。如果其中一個元素包含,則觸發(fā)規(guī)則来颤。
代碼實現(xiàn)
這里用代碼片段來演示此功能的實現(xiàn)驮捍。
兩個集合相關(guān)代碼:
public class Company {
private List<String> scopes;
public List<String> getScopes() {
return scopes;
}
public void setScopes(List<String> scopes) {
this.scopes = scopes;
}
}
Company company = new Company();
List<String> targetList = new ArrayList<>();
targetList.add("教育");
targetList.add("P2P");
company.setScopes(targetList);
List<String> blackList = new ArrayList<>();
blackList.add("房地產(chǎn)");
blackList.add("游戲");
blackList.add("P2P");
kieSession.insert(company);
kieSession.insert(blackList);
kieSession.fireAllRules();
Drools drl 中實現(xiàn)對此內(nèi)容的比較有兩種方案,一種方案是直接調(diào)用外部的工具類進(jìn)行比較脚曾,采用global進(jìn)行引入东且,這里不再介紹,另外一種就是采用自定義function進(jìn)行匹配處理本讥,然后將結(jié)果返回給when部分進(jìn)行處理珊泳。
規(guī)則代碼:
package com.compareList
import com.secbro2.drools.entity.Company
import java.util.List
import java.util.ArrayList
rule "compareListRule"
when
$blackList: List();
$company: Company($scopList:scopes,toCompareList(scopes,$blackList));
then
System.out.println("黑名單規(guī)則觸發(fā)!");
end
function Boolean toCompareList(List targetList, List blackList){
Boolean flag = false;
for(Object obj : targetList){
if(blackList.contains(obj)){
flag = true;
break;
}
}
return flag;
}
其中toCompareList提供的對比的功能,而該功能的結(jié)果又用作Company的過濾條件來進(jìn)行篩選拷沸。如果篩選結(jié)果符合色查,說明兩個集合里面有交叉部分,因此出發(fā)規(guī)則進(jìn)行相應(yīng)處理撞芍。
更多規(guī)則引擎相關(guān)視頻教程可觀看:
CSDN學(xué)院:《Drools7系列優(yōu)惠套餐》