09 Accumulate语法分析

代码地址:https://github.com/ImTravis/drools

1、Accumulate内联语法(推荐)

<result pattern> from accumulate( <source pattern>,

                                  init( <init code> ),

                                  action( <action code> ),

                                  reverse( <reverse code> ),

                                  result( <result expression> ) )

<result pattern>:这是一个规则模式,引擎试图匹配从返回的对象。如果匹配,则累加条件元素的计算结果为true,然后引擎继续计算规则中的下一个CE。如果不匹配,累加CE的值将为false,引擎将停止为该规则计算CEs。

<source pattern>:源模式是一个常规模式,引擎将尝试匹配每个源对象。

<init code>:这是所选方言中的一个语义代码块,在遍历源对象之前,将对每个元组执行一次。

<action code>:这是所选方言中的一个语义代码块,将为每个源对象执行。

<reverse code>:这是所选方言中可选的语义代码块,如果存在,将为不再匹配源模式的每个源对象执行。这个代码块的目的是撤销在块中所做的任何计算,这样引擎就可以在修改或删除源对象时进行递减计算,极大地提高了这些操作的性能。(实操时没有起作用,编码中...

<result expression>:这是在所选方言中的一个语义表达式,在遍历所有源对象之后执行。

通俗得讲

  • init 初始化变量
  • action 每次遍历执行的动作
  • reverse (可选)反转动作,用于优化
  • result 返回的执行结果

2、accumulate 中可使用的Drools内置的累加函数功能

  • average
  • min
  • max
  • count
  • sum
  • variance
  • standardDeviation
  • collectList
  • collectSet

 

2.1 collectList (注意写法)

累加函数返回:从遍历数据中取出指定数据的集合

取出动物集合中价格低于120的动物的名字集合

 

与From相比,取出集合中性别为女性的集合

 

实际操作中,collectList的方式更为强大,且不容易出错

2.2 其他相关的函数操作,见代码

ComponentRuleTest.accumulate()测试类

执行得时候,把其他规则调用注释了,防止同时调用几条规则;(小伙伴可以试下,多条连续的fireAllRules

(入参Fact一样)之间如果没有kieSession.insert(...),操作,只执行最上一条规则)

如果需要同时调用几条规则,建议通过group或者RuleNameEndsWithAgendaFilter...等来控制

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值