Drools规则LHS条件涉及空列表时如何正常触发规则
问题根因
你当前的checkfacts规则无法在列表为空时触发,是因为LHS中的$a : A() from $b.As语句要求必须从$b.As中匹配到至少1个A类型的实例,当列表为空时该条件不成立,整段LHS匹配失败,规则自然不会触发。
解决方案
根据你的业务需求可选以下两种修改方式:
场景1:处理逻辑不需要用到As中存储的A实例,仅需处理B对象
直接删除LHS中匹配A的行即可,只要B对象插入工作内存,规则就会触发,和As是否为空完全无关:
rule "checkfacts" when $b : B(); then // 直接处理$b即可 end
场景2:处理逻辑需要用到As中的A实例(空列表时也要走对应的分支逻辑)
使用collect函数收集所有A实例,无论列表是否为空collect都会返回对应的ArrayList对象,可满足匹配条件:
rule "checkfacts" when $b : B(); $aList : ArrayList() from collect(A() from $b.As); then // 可先判断$aList是否为空再走对应逻辑 if($aList.isEmpty()){ // 空列表的处理逻辑 }else{ // 非空时遍历处理A实例 for(Object a : $aList){ A actualA = (A)a; // 处理A的逻辑 } } end
内容的提问来源于stack exchange,提问作者Thomas Seilund
相关产品推荐
相关产品推荐

