Drools规则编写:检查一个列表是否包含另一个列表所有元素
Drools规则实现列表全包含校验的正确方式
问题根源
你写的规则有两个核心问题:
- Drools内置的
contains运算符仅支持单个元素的存在性检查,不能直接传入集合做包含判断。 - 模板参数替换后生成的
[TaskSpecification3, TaskSpecification4]被解析器误识别为方法调用(比如TaskSpecification3()),触发语法错误。
正确实现方案
方案1:直接调用Java集合的containsAll方法(最简)
利用Java List自带的containsAll方法,一步完成“Fact的names列表包含传入参数所有元素”的校验:
// 假设$names是通过全局变量传入的List<String> global java.util.List $names; rule "ValidateListContainsAll" when // 检查Fact的names属性是否包含$names中的所有元素 $fact: Fact(names.containsAll($names)) then System.out.println("满足条件,执行动作"); // 这里写你的业务逻辑 end
方案2:用forall遍历校验(灵活扩展)
如果需要对每个元素添加额外校验逻辑,可使用forall构造遍历传入的参数列表:
global java.util.List $names; rule "ValidateWithForall" when $fact: Fact() $paramList: List() from $names // 确保参数列表中的每个元素都在Fact的names里 forall( $elem: String() from $paramList $fact.names contains $elem ) then System.out.println("所有元素均存在,执行动作"); // 业务逻辑 end
参数传递注意事项
- 若
$names是全局参数,需在初始化KieSession时设置:kieSession.setGlobal("names", yourTargetList); - 若
$names是作为事实插入引擎的,规则条件需先匹配该列表:
rule "ValidateWithInsertedList" when $paramList: List() // 匹配插入的列表事实 $fact: Fact(names.containsAll($paramList)) then // 业务逻辑 end
内容的提问来源于stack exchange,提问作者Samyak
相关产品推荐
相关产品推荐

