List 在drools中,是否可以对传递到drl文件的java列表应用规则,而不将该列表放入工作内存?

List 在drools中,是否可以对传递到drl文件的java列表应用规则,而不将该列表放入工作内存?,list,iteration,drools,List,Iteration,Drools,我最近开始使用Drools,在编写drl文件时,我遇到了这个问题。我正在创建一个“Person”类对象的列表,并将该列表传递给一个.drl文件。现在我想迭代列表,检查“salary”大于某个值的Person(类Person的对象)。但是,既然将集合放入工作内存是一种糟糕的做法,那么不这样做就可以进行迭代吗?迭代是Drools规则固有的。这是命令式语言中规则和if语句之间的区别之一。这条规则将针对你工作记忆中的每一个对象(这不是100%准确;Drools比这更聪明)进行评估 因此,如果您在会话中插

我最近开始使用Drools,在编写drl文件时,我遇到了这个问题。我正在创建一个“Person”类对象的列表,并将该列表传递给一个.drl文件。现在我想迭代列表,检查“salary”大于某个值的Person(类Person的对象)。但是,既然将集合放入工作内存是一种糟糕的做法,那么不这样做就可以进行迭代吗?

迭代是Drools规则固有的。这是命令式语言中规则和if语句之间的区别之一。这条规则将针对你工作记忆中的每一个对象(这不是100%准确;Drools比这更聪明)进行评估

因此,如果您在会话中插入每个Person对象作为事实,您只需要有一条规则即可完成所需操作:

rule 'Check Person Salary'
when
    $p: Person(salary > 1000)
then
    //do whatever you want with $p
end
每次插入Person对象时,都将为其计算规则。如果对象通过评估,将生成该规则的新激活。 调用fireAllRules()时,将执行所有激活:将执行激活规则的RHS。当然,这只是Drools和RETE算法工作原理的粗略解释。有关更精确的信息,请参阅Drools文档


希望有帮助,

非常感谢Esteban。现在假设我一次插入一个Person对象列表,而不是一个Person对象(如您所解释的)。是否可以在不将列表放入工作内存的情况下,对单个元素迭代此列表并对元素应用规则?如果不想将列表放入工作内存,则必须在java代码中迭代并对其每个元素执行insert()调用。确定..明白了。谢谢你,埃斯特班。