00:00
了解了个体模式当中量词的用法,那接下来呢,我们再来介绍个体模式的另外一大要素,就是条件condition啊,其实我们知道对于每个个体模式来讲。要做事件的匹配,其实核心的逻辑就在于得定义一个筛选的条件,就像我们在这里啊,你要匹配每一个事件,诶,那到底是什么样的事件呢?那当然就是给一个will里边定义当前的筛选条件是even的type要等于fail,这就是登录失败事件。所以对于这个每一个个体模式而言,它都必须要有对应的条件定义。那除了这里给一个where指定当前的筛选条件之外,诶,那它可以去设置的过滤条件,还可以是当前数据类型的子类型,我们可以看到在pattern里边有一个方法就叫做。Time,哎,我们看到有一个这样的方法,那就是指明我们要筛选的事件,它的数据类型是我整个数据流里边的某种子类型数据啊,这可以认为是一种比较特殊的筛选条件啊,那其他更加一般化的条件呢?诶,当然就是直接点where指定,到底怎么去筛选啊,那我们知道这个where里边关键的这个条件啊,本质上来讲可以认为就是一个filter啊,啊就相当于就是指定啊,根据我们的输入情况,当前的数据的情况,判断一下返回到底是true还是false,只有返回是true的时候,这个时候我们就把对应的数据提取出来啊,当前就匹配成功了,否则的话匹配失败直接把数据丢掉。
01:39
那这里的这个筛选条件呢,根据它具体应用的不同类型,又可以分成这样几大类啊,那就是可以分成简单条件,迭代条件,复合条件以及终止条件啊,那接下来我们可以分别的进行一个介绍啊,哎,那首先我们先说这个简单条件,简单条件其实非常的容易理解,就是where,然后里边传入一个LA的表达式,告诉我们根据当前数据的啊里边的某个字段或者某些特性,然后去进行一个条件判断,哎,那返回一个布尔类型的值就可以了,哎,所以一般情况我们在定义模式的时候啊,用的都是这种方式,直接一个拉表达式。
02:21
指定当前的筛选条件。但是如果我们要是看的比较仔细的话,追到源码里边就会发现这里的where。它指定的这个condition啊,默认情况下啊,其实应该传的是一个condition,这是一个所谓的迭代条件啊,那我们可以看到啊,这个condition呢,它本身是一个Java的抽象类,在这个抽象类里边,我们看到必须要实现一个filter方法,哎,那所以我们看到它本质上啊,确实就跟filter方式差不多啊,就是给一个这个过滤筛选的条件,然后我们看到这里边有一个T类型的一个参数,那很显然就是对应的这个数据了啊,当前这条数据到底是什么事件到底是什么。
03:06
然后后边呢,还有一个参数,它是一个迭代条件的上下文context,所以我们就会发现啊,这个迭代条件跟简单条件所不同的地方当然就在这里了,就在于这里的上下文,哎,那这个上下文是什么呢?我们看到这是一个接口啊,它继承自time context啊,那time context里边我们看到,诶,这就能获取到时间相关的信息了啊,那跟我们之前接触到的那个上下文有点类似啊,能够获取到当前的时间戳以及处理时间。所以迭代条件能够做的事情当然就比简单条件要更多,哎呀,其实我们追到这个源码里边啊,在同样的这个包下边,我们也能发现另外一个简单条件的底层实现,它就叫做simple condition啊,那为什么我们直接传一个简单条件也可以呢?啊,因为它本身也继承自。
04:03
Condition,而且它实现了filter function接口啊,那所以一般我们在调用的时候啊,也不用管它底层的这个实现到底是怎么样的,我们直接传一个拉姆达表达式就可以在SC拉代码当中表示一个简单条件,因为我们知道拉姆达表达式可以认为就是一个单一抽象方法接口的一个语法糖嘛,哎,所以相当于我们就实现了simple condition这样一个抽象类。这就是关于简单条件和迭代条件的基本用法啊,那所以对于这个迭代条件而言,一般情况我们如果要是单独去用的话,那得怎么用呢?那就相当于我们这里要实现一个拉姆达表达式的话,实现的就是里边这里的这个filter方法了,所以它的参数就得有两个啊,那除了第一个我当前获取到的事件之外,还得有一个。迭代条件的上下文啊,那这个上下文里边除了可以获取到时间相关的信息之外,另外我们看到啊,它还可以去get events for pattern。
05:08
哎,那这是什么意思呢?当然就是传入一个个体模式的名称,然后就可以直接获取到已经匹配到的那些事件了,诶所以这个迭代条件为什么叫做迭代条件呢?就是我们定义了很多个个体模式,然后呢,它在做对应事件的一个匹配筛选,那所以如果说我们后边的某一个个体模式,他在做处理的时候,能不能捕获到之前的。个体模式里边已经匹配到的事件呢?如果是简单条件当然不能,它只能获取到自己对应的那个事件,而如果是迭代条件的话,这里利用get events for patternth这个方法就可以捕获到之前其他的个体模式已经匹配到的事件啊,所以这就可以迭代进行操作了啊,它的功能其实还是非常强大,我们可以看一下这里的这个事例,哎,那就是我们这里定义一个sum。
06:04
它里边要使用上下文去获取一下叫做middle的这个个体模式里边的值,而这里的middle本身呢,诶,我们看前面啊,本身就是它自己的定义嘛,Middle one or more,它是一个循环模式,接收的事件呢,可以是一次或多次。所以接下来我们直接get到对应middle,他拿到的那些事件呢,本身是一个列表,一个list,我们直接把它map一下,Map成什么呢?提取它里边的amount对应的这个字段,然后做一个sum啊,在SC里边,我们直接针对这个例子的集合类型啊,做了对应的这样的一个转换计算,得到了一个总和。然后我们就可以判断,诶,这前面我们获取到的所有的这个总和到底是什么呢?其实就是在当前接收到这个事件之前,自己对应的这个个体模式啊,已经捕获到的所有数据的和,哎,那所以我就判断一下已有的和,加上当前数据里边的数量amount,哎,那是否超过了100这个上限呢?哎,那如果是小于100的话,那么我们就继续匹配,继续接收,如果要是超过了100,那就相当于返回就是false了,那就不再去接收对应的事件,诶所以这某种意义上啊,可以使用这样一个迭代条件,控制我们当前这个弯帽接收事件的一个上限,诶,不要超过一定的限度。
07:33
那当然了,我们前面还加了一个条件,就是要求当前它的user必须是以A开头的用户啊啊,那对应的这些条件我们都可以去做一个组合的定义。这就是关于迭代条件的用法,哎,那前面我们在这个迭代条件里面也发现了啊,假如说我们对于当前这个事件筛选的条件它有很多个的话,那其实可以在里边的代码逻辑里边使用这个逻辑与或非去进行一个条件的组合啊,当然这种方式是可以的,但是呢,这种在代码当中的这种硬组合其实可能性会比较差,所以更好的方式其实是在外边我们用点V去进行调用的时候,就在后边紧跟着另外一个逻辑上能组合在一起的条件。
08:21
哎,那所以这就是我们所谓的组合条件的使用,那就是一个个体模式,有多个限定条件的时候,我们既可以在一个VR里边利用这个逻辑判断去把它进行一个组合,也可以直接用方法调用的方式啊,点位后边再跟上其他的方法。那后面跟什么样的方法呢?哎,那就要看我们当前要去组合的到底是逻辑语还是逻辑或了,那如果是逻辑语的话,哎,那直接就是where,后边再点就可以了啊,就不停的在后面点where,就表示他们要同时发生逻辑与的关系才能够生效。
09:00
那如果是逻辑或呢?哎,逻辑或更简单,就是直接去调用一个点二方法,二方法这里边所定义的呢,同样跟威尔一样,也是要传入一个迭代条件,当然传入一个简单条件也是可以的啊,哎,那就是说二里边定义的条件跟之前威尔定义的条件呢,只要满足一个当前这个事件就可以成功的匹配。那另外就是前面我们说的这个type啊,此类型的判断也可以跟不同的其他条件组合起来,这些都叫做组合条件。这就是组合条件的用法啊,那最后呢,还有一类条件叫做终止条件啊,其实我们知道对于循环模式而言,在有些情况下啊,比如说这个one or more,或者说这个one more加上一个optional,对于这种条件我们有可能要无限的等待,因为他不知道到底能重复匹配多少次嘛,那如果说无限等待的这个过程呢,很显然我们就要一直保持着相应的状态,一直要对它进行匹配的判断,那在这个过程当中很容易就会耗尽所有内存资源,所以一般情况下呢,针对它我们就要指定一个终止条件,就什么情况下就停止了,不要再去继续循环匹配了。
10:18
啊,那这种条件定义呢?那就是调用一个n until方法,N until方法同样传入一个迭代条件,当然了,传入一个简单条件也是可以的,它表示的就是说当我们这里边指定的这个条件满足的时候,那么之前的循环模式就全部终止了,就可以清空状态,释放内存了。所以我们需要注意啊,这个until终止条件它只跟one or more或者one or more optional结合在一起使用。因为在这种情况下,我们并不知道后面还有没有继续到来的事件嘛,所以我们要一直等啊,这个时候就要做一个终止。这就是关于个体模式的条件定义,一般我们使用最多的当然就是简单条件了,我们在代当中只要传入一个拉姆达表达式,就可以实现对应事件的提取。
我来说两句