在使用Drools規則引擎時,有朋友會遇到這樣的問題,就是在when部分判斷的兩個參數都是集合類型,好比兩個List,此時要判斷一個集合是否包含另一個集合的內容。java
拿一個具體的例子來講明,個人公衆號《程序新視界》接受商務合做有必定的要求,設置了對應行業的黑名單,好比:房地產、遊戲和P2P領域的合做不接。微信
那麼此時,有一個廣告商準備投放廣告,而它投放的廣告領域涵蓋了教育和P2P,那麼,在進行規則篩選時就出現了要判斷提供的集合中的元素是否包含在被排除領域裏面。若是其中一個元素包含,則觸發規則。工具
這裏用代碼片斷來演示此功能的實現。 兩個集合相關代碼:this
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("房地產"); blackList.add("遊戲"); blackList.add("P2P"); kieSession.insert(company); kieSession.insert(blackList); kieSession.fireAllRules();
Drools drl 中實現對此內容的比較有兩種方案,一種方案是直接調用外部的工具類進行比較,採用global進行引入,這裏再也不介紹,另一種就是採用自定義function進行匹配處理,而後將結果返回給when部分進行處理。.net
規則代碼:code
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("黑名單規則觸發!"); 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提供的對比的功能,而該功能的結果又用做Company的過濾條件來進行篩選。若是篩選結果符合,說明兩個集合裏面有交叉部分,所以出發規則進行相應處理。視頻
更多規則引擎相關視頻教程可觀看:教程
CSDN學院:《Drools7系列優惠套餐》 遊戲