如何在Drools中检查指定值是否不存在于给定列表?
规则编写问题排查与解决
问题背景
现有伪代码定义的类结构:
class Student{String name;} class Department{List<Student> students;}
场景是:有姓名为“A”“B”“C”的三名学生,需求是检查学生“A”是否不存在于Department的students列表中,若A存在,则规则的then子句不能执行。
尝试过以下两种规则写法,但then子句依然会执行,不符合预期:
studentDetails1: department.students; 1. not (exists ( Student(name == "A") from studentDetails1)) 2. not (Student(name == "A") from studentDetails1)
问题排查和解决办法
为什么之前的写法不对?
- 第一种写法逻辑本身没问题,但因为变量绑定和规则引擎的语法细节,导致没有正确生效。你把整个students列表绑定成
studentDetails1后,exists的检查没有和这个列表的元素正确关联。 - 第二种写法语法错误,
from子句必须配合exists/forall这类量化器使用,单独用not加from没法正确表达“集合里不存在该元素”的逻辑。
正确的规则写法
写法一:直接在Department对象中用not exists检查
rule "Check Student A Not Exists" when Department( not exists Student(name == "A") from students ) then // 只有当A不存在时才执行这里的逻辑 end
写法二:绑定Department变量后再检查
如果需要在后续逻辑中用到Department对象,可以先绑定变量:
rule "Check Student A Not Exists" when $dept: Department() not exists Student(name == "A") from $dept.students then // 只有当A不存在时才执行这里的逻辑 end
写法三:用not contains直接判断集合
部分规则引擎支持直接用not contains检查集合元素:
rule "Check Student A Not Exists" when Department( students not contains Student(name == "A") ) then // 只有当A不存在时才执行这里的逻辑 end
内容的提问来源于stack exchange,提问作者Arun Kumar N
相关产品推荐
相关产品推荐

