如何从流口水地图中的地图中获取值

How to get a value from a map inside a map in drools

我有一个主地图对象,其中包含另一个地图。现在我需要在 drools 中获取它的价值吗? 我的代码看起来像

HashMap<String,Object> studentsMap = new HashMap<String,Object>();
HashMap<String,int> marksMap = new HashMap<String,int>();
marksMap.put("Maths",98);
marksMap.put("Chemistry",96);
studentsMap.put("JohnDoe", marksMap);

我正在将此 'studentsMap' 对象插入流口水会话并触发规则。 How to compare marks values in drools (How to check condition if mark is greater than 90)?

我还没有尝试过,但也许可以做到 规则 "studentsMap"<br> 当<br> 条目:条目()来自$studentsMap.entrySet()<br> marksMap : 来自 entry.getValue() 的 Map() markEntry : 来自 marksMap.entrySet() 的 Entry() 标记:来自 markEntry.getValue()<br> 的 Number() 标记 > 90 然后<br> System.out.println("mark greater than 90");<br> 结尾

我假设你的真实姓名是学生。 规则将如下所示:

rule "studentsMap"

when
  Student($markMap : markMaap)
  eval($markMap["Maths"] > 90)
 then

 System.out.println("mark greater than 90");

end

建议的解决方案对我不起作用。

您需要在 eval 中以不同方式调用 map。

rule "studentsMap"

when
  Student($marks : markMap)
  eval((int)$marks.get("Maths") > 90)
 then
  System.out.println("mark greater than 90");
end

还应该进行额外的转换。

链接:http://lists.jboss.org/pipermail/rules-users/2007-November/003921.html

UPD:找到了更传统的方法

rule "studentsMap"

when
  $student: Student($marks : markMap, $marks.get("Maths") > 90)
 then
  System.out.println("mark greater than 90");
end

您还可以在调用 get 之前检查地图中是否存在键。

  $student: Student($marks : markMap, $marks.containsKey("Maths"), $marks.get("Maths") > 90)