Drools规则引擎判断集合List是否包含集合

37次阅读

共计 1411 个字符,预计需要花费 4 分钟才能阅读完成。

问题场景

在使用 Drools 规则引擎时,有朋友会遇到这样的问题,就是在 when 部分判断的两个参数都是集合类型,比如两个 List,此时要判断一个集合是否包含另外一个集合的内容。

拿一个具体的例子来说明,我的公众号《程序新视界》接受商务合作有一定的要求,设置了对应行业的黑名单,比如:房地产、游戏和 P2P 领域的合作不接。

那么此时,有一个广告商准备投放广告,而它投放的广告领域涵盖了教育和 P2P,那么,在进行规则筛选时就出现了要判断提供的集合中的元素是否包含在被排除领域里面。如果其中一个元素包含,则触发规则。

代码实现

这里用代码片段来演示此功能的实现。
两个集合相关代码:

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 部分进行处理。

规则代码:

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 系列优惠套餐》

正文完
 0