问题场景

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

最新文章

  1. 给Source Insight做个外挂系列之一--发现Source Insight
  2. swift跳转到Appstore
  3. Oracle中Merge into用法总结
  4. Jenkins 插件开发笔记
  5. spring,mybatis事务
  6. 倒计时js代码
  7. SQL SERVER触发器游标小记
  8. Interoperability between Java and SharePoint 2013 on Premises
  9. session实现防止重复提交,以及验证
  10. 2016&quot;百度之星&quot; - 初赛(Astar Round2A) 1004 D Game 区间DP
  11. Java基础之创建窗口——颜色和光标(TryWindow4)
  12. Python的Ftplib问题:UnicodeEncodeError: 'latin-1' codec can't encode characters的解决方法
  13. Git合并分支出现的冲突解决
  14. mysql主从配置主主配置
  15. JSON 的含义?
  16. BZOJ_3261_最大异或和_可持久化trie
  17. 不能够连接到主机(名称为localhost)上的MySQL服务”
  18. Activity的启动
  19. salesforce零基础学习(八十九)使用 input type=file 以及RemoteAction方式上传附件
  20. 20155332 2016-2017-2 《Java程序设计》第8周学习总结

热门文章

  1. ARC forbids explicit message send of&#39;retain&#39;解决办法
  2. OPENGL---Ps 径向模糊算法(glsl)
  3. 微信小程序实战之天气预报
  4. Android零基础入门第46节:下拉框Spinner
  5. 基于VUE实现的新闻后台管理系统-三
  6. 卸载win10内置windows app的方法
  7. A simple in-process HTTP server for UWP
  8. delphi程序向另一个可执行程序发消息(使用GetForegroundWindow; 找出当前操作系统中活动的第一个窗口)
  9. Delphi事件的广播
  10. VM中linux和windows主机进行串口通信