我的工作内存中有一个 ArrayList,我正在 when 子句中使用“from”语句对其进行迭代。然而,该规则是向后迭代数组。有没有办法控制这种行为?
列表创建:
List<Map<String,String>> list = new ArrayList<Map<String,String>>();
Map<String,String> m1 = ...
Map<String,String> m2 = ...
list.add(m1);
list.add(m2);
ImportItem item = new ImportItem(list); //model object. Constructor arg returned by getInput()
StatelessKnowledgeSession session = knowledgeBase.newStatelessKnowledgeSession();
session.insert(item);
session.fireAllRules();
流口水规则:
rule "My Rule"
dialect "java"
when
item : ImportItem(ignore == false) //model object that holds the input
map : Map() from item.getInput() // == the ArrayList from above
then
System.out.println(map);
end
产品
<output of m2>
<output of m1>
最佳答案
迭代不是向后的,正如您在 session 中附加审核日志时所看到的那样。默认情况下,规则的执行遵循 LIFO 顺序(如果您不使用任何其他冲突解决策略)。
我对您的建议是不要尝试将对象封装在数据结构中。如果您正在读取文件的行并且需要按顺序处理这些行,只需使用一个类来表示该行并将这些行直接插入到 session 中即可。为了保证执行顺序,可以使用行号作为显着性参数。
例如:
rule "Process lines in order"
// salience executes from higher number to lowest number, so using the
// negative value you will executem them from the first to the last
salience (- $lineNumber )
when
$line : Line( $lineNumber : lineNumber )
then
// do something with $line
end
显然,相同的技巧可以用于您采用的“from”方法,但引擎在工作内存中匹配事实比迭代对象集合要高效得多。
希望有帮助。 埃德森
关于jboss - 为什么 'from'关键字会向后迭代?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4752137/