Drools规则文件动态创建Map<String,String>及规则匹配相关疑问
疑问1解答
$studentAwards: List() 是匹配你传入Drools的事实对象中的List实例,不会新建List。
Drools规则的when块是条件匹配区,所有写在这里的声明语法都是从已插入的facts集合中查找符合类型/约束的对象,你在getDroolsFacts方法中已经把待填充的studentAwards列表作为fact传入,所以这里匹配到的就是你传入的原对象,规则执行时对它的修改会直接作用在原实例上,因此你可以从该对象中拿到最终的奖励结果。
疑问2解答
你写的metadata代码无法运行的核心原因是:when块只能写条件匹配逻辑,不能写普通Java执行语句,创建HashMap、调用put方法这些操作属于规则触发后的动作,必须放到then块中执行。
你要实现的“每条规则独立创建新Map、填充后生成奖励”的需求,直接把metadata相关的三行代码移到对应规则的then块最前面即可,修改后的规则示例如下:
rule "award_65" when $Student: Student(status == "active" && marks > 65); $studentAwards: List(); then // Map创建、赋值逻辑放到then块中执行 Map<String, String> metadata = new HashMap<>(); metadata.put("status", "active"); metadata.put("marks", "65"); final StudentAward studentAward = StudentAward.from("Award65" , metadata); $studentAwards.add(studentAward); end rule "award_75" when $Student: Student(status == "active" && marks > 75); $studentAwards: List(); then Map<String, String> metadata = new HashMap<>(); metadata.put("status", "active"); metadata.put("marks", "75"); final StudentAward studentAward = StudentAward.from("Award75" , metadata); $studentAwards.add(studentAward); end
then块的代码会在每条规则满足条件触发时独立执行,因此每个符合条件的规则都会生成专属的Map实例,最终所有生成的奖励都会被添加到你传入的$studentAwards列表中,完全符合需求。
内容的提问来源于stack exchange,提问作者maneesh
相关产品推荐
相关产品推荐

