如何从drools中的地图内的地图获取值

时间:2016-04-22 13:37:52

标签: 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'对象插入到drools会话并触发规则。 如何比较drools中的标记值(如果标记大于90,如何检查条件)?

3 个答案:

答案 0 :(得分:2)

建议的解决方案对我没有用。

您需要在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)

答案 1 :(得分:0)

我还没有尝试过,但可能会有这样的事情 rule "studentsMap"
when
entry : Entry() from $studentsMap.entrySet()
marksMap : Map() from entry.getValue() markEntry : Entry() from marksMap.entrySet() mark : Number() from markEntry.getValue()
mark > 90 then
System.out.println("mark greater than 90");
end

答案 2 :(得分:0)

我假设你的事实名称是学生。 该规则将如下所示:

rule "studentsMap"

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

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

end