You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 03:54:02