问题场景

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

Drools规则引擎-判断集合(List)是否包含集合的更多相关文章

  1. Drools规则引擎-如果判断某个对象中的集合是否包含指定的值

    规则引擎集合相关处理 在实际生产过程中,有很多关于集合的处理场景,比如一个Fact对象中包含有一个集合,而需要判断该集合是否包含某个值.而Drools规则引擎也提供了多种处理方式,比如通过from.c ...

  2. Drools规则引擎入门指南(一)

    最近项目需要增加风控系统,在经过一番调研以后决定使用Drools规则引擎.因为项目是基于SpringCloud的架构,所以此次学习使用了SpringBoot2.0版本结合Drools7.14.0.Fi ...

  3. Drools规则引擎-memberOf操作

    场景 规则引擎技术讨论2群(715840230)有同学提出疑问,memberOf的使用过程中如果,memberOf之后的参数不是集合也不是数组,而是格式如"1,2,3,4"的字符串 ...

  4. Drools规则引擎实践直白总结

    目录 1. 创建Drools环境(引入Drools相关依赖包.现在都流行spring boot,故最简单有效的依赖才是最好的,kie-spring内部自行依赖了drools相关核心的依赖包) 2. 了 ...

  5. Drools 规则引擎应用

    规则引擎-drools 1 .场景 1.1需求 商城系统消费赠送积分 100元以下, 不加分 100元-500元 加100分 500元-1000元 加500分 1000元 以上 加1000分 .... ...

  6. Drools 规则引擎应用 看这一篇就够了

    1 .场景 1.1需求 商城系统消费赠送积分 100元以下, 不加分 100元-500元 加100分 500元-1000元 加500分 1000元 以上 加1000分 ...... 1.2传统做法 1 ...

  7. drools规则引擎初探

    https://www.cnblogs.com/yuebintse/p/5767996.html 1.drools是什么 Drools是为Java量身定制的基于Charles  Forgy的RETE算 ...

  8. Drools规则引擎

    一.简介 Drools is a Business Rules Management System (BRMS) solution. It provides a core Business Rules ...

  9. Drools 规则引擎环境搭建

    一.关于 drools 规则引擎 前面写过一篇 Drools 规则引擎相关的文章,这篇文章主要记录一下规则引擎的环境搭建和简单示例.不熟悉 drools 的朋友可以看看这篇文章: 自己写个 Drool ...

随机推荐

  1. 更改开机默认不显示explorer.exe,直接启动自己写的EXE程序方法

    原文:更改开机默认不显示explorer.exe,直接启动自己写的EXE程序方法 更改开机默认不显示explorer.exe,直接启动自己写的EXE程序的函数: bool UpdateWinlogon ...

  2. 关于Android 7.0更新后调用系统相机及电筒问题

    android升级到7.0后对权限又做了一个更新即不允许出现以file://的形式调用隐式APP,需要用共享文件的形式:content:// URI 因为系统相机是提供的共享 Provider , C ...

  3. PHP提取字符串中的图片地址

    PHP提取字符串中的图片地址 $str='<p><img border="0" src="upfiles/2009/07/1246430143_1.jp ...

  4. WinForm TreeView单击,但是获取的是上一次点击选中的节点

    /// <summary> /// MouseDown是鼠标按下事件发生在你鼠标单击事件之前,你单击鼠标发生了两个动作,一是鼠标按下二是鼠标抬起.执行之后,就会把SelectedNode转 ...

  5. 01 Python初探

    Python初探 Become a better version of yourself! 诞生 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年开始写Python ...

  6. ext中设置grid单选,取消选择

    原代码(无法取消选择)如下: selModel: Ext.create('Ext.selection.CheckboxModel', { mode: "SINGLE", allow ...

  7. 比快更快——微软LightGBM

    LightGBM介绍 xgboost是一种优秀的boosting框架,但是在使用过程中,其训练耗时过长,内存占用比较大.微软在2016年推出了另外一种boosting框架--lightgbm,在不降低 ...

  8. Easy Compression Library(代替TFileStream, TMemoryStream and TStream)

    Easy Compression Library is a very easy-to-use replacement of TFileStream, TMemoryStream and other T ...

  9. Redis简介和安装

    Redis介绍 Redis是一种Key-Value存储系统(数据库),其提供了一组丰富的数据结构,如List,Sets,Hashes和Ordered Sets Redis安装 wget <Red ...

  10. 分布式文件系统之MooseFS----介绍

    前一段公司因为nfs存储的问题,做了一段时间的调研.最终虽然有nfs高可用方案(nfs+drbd+heartbeat),但是在nfs故障切换的时候会出现 2 分钟左右的延时.这样子...就开始了对分布 ...