00:00
说完了最基本的map转换操作,接下来呢,我们再来介绍另外一个非常简单的基本转换算子,那就是过滤filter filter顾名思义就是说对于我们当前的数据流执行一个筛选过滤的操作,所以我们这里边关键要给的呢,就是一个布尔类型的条件表达式啊,就返回一个布尔类型的值,这个条件表达式对我们当前数据流里的每一个元素要做一个判断,如果得到的结果是true,那么当前的元素就正常输出保留下来。如果结果为false,诶,那不好意思,当前这个元素就不会输出,相当于被过滤掉了,所以整体来讲的话,前面我们讲到的这个map操作呢,它是真正意义上的一对一,有一个输入就有一个输出,而且我们知道这里的经过转换之后啊,当前元素的数据类型是有可能变化的,而现在的filter呢。首先它并不是一一完全对应的,那我们知道它其实是。
01:04
一个输入有可能对应一个输出,也有可能对应零个输出,没有输出直接被滤掉了啊,那另外还有一点就是当前他其实不做任何的转换,只是原样输出而已,所以它的类型也不会变,那对应在代码里边的调用的时候,我们就是直接调data stream的点filter方法做一个过滤就可以了。好,接下来呢,我们同样可以在代码里边去做一个简单的测试,我们还是去创建一个object,当前我们叫做transform。Filter test。啊,那同样还是没方法,那接下来我们这个基本的流程基本是不变的啊,所以我这里其实前面的创建执行环境和读取数据源,我都可以直接照搬,直接copy过来啊,当然引入对应的类的时候呢,啊,还要注意就是我们这里边啊,直接把它改成下划线,方便我们后边做影视转换,好,那接下来呢,我们就可以。
02:08
实现一个需求了,比如说现在我们要做过滤,我们要过滤出用户。喂。Mary的。所有点击事件。所以这个需求就是要求我们当前这个event里边,它的user字段要等于Mary啊,那怎么样去写这样的一个表达呢?非常简单,我们直接stream在这儿去调一个filter。里边我们发现啊,这个filter跟map非常类似,点进去的话,我们会发现它有两种实现方式,一种方式是直接去实现一个filter function接口,那这个filter function接口我们会发现啊,呃,也是一样的,当前它有唯一的一个抽象方法,就叫做filter,它返回一个booing类型的值,那么传入的数据呢,是一个T类型,T类型就是我们当前数据流里边的元素类型嘛,哎,那所以当然就是针对每一个数据元素,那么。
03:08
进行一个判断,返回一个true false的负值。我们可以用这种方式直接做一个实现啊,那当然了,另外还有一种方式,我们看到下边同样可以直接给一个拉姆达表达式啊,那所以这里边呃,我们同样还是这样的两种方法啊呃,那接下来我们首先第一种方式。使用匿名函数,也就是拉姆达表达式。那这里的写法我们直接可以用下划线来做一个代替,现在要判断的是user,哎,那我们当然就是判断当前的user是否。等于Mary,如果相等的话,诶这里返回处,那么当前的数据就会被保留下来,那如果说它返回false的话,不是Mary的话,那么就会被直接过滤掉,就。不会有任何的输出了啊,那后面我们可以直接PRINT1。
04:04
同样,后面还有第二种方式,那就是我们说的。实现。Filter function。接口。啊,那这种方式的话,同样还是在里边,我们就要去拗一个。自己实现类的对象啊,那对应的这个实现类呢,我们需要在下面单独的定义出来啊,还是class,我们比方说这个就叫做user future extend。Filter function。我们看到filter function,它就只有一个泛型,因为我们不涉及到输入输出的转换嘛,所以这里边肯定就只是。里边必须要实现的一个抽象方法就叫做filter啊,那这里面的逻辑跟我们上面的指定是一样的,我们直接t.user判断它是否等于。Marry就可以了啊,那当然了,如果说我们想要换一个方式去判断的话,比方说我们想要判断它的用户是否是Bob的话,那就直接把这个字段改成Bob就可以了。
05:09
接下来我们在上面直接new一个user future。点print这里打印一个二。最后不要忘记en zcu执行起来,接下来我们可以做一个运行测试。运行起来我们可以看到非常明显,第一条流的处理方式,我们得到的就是Mary的点击数据,而第二种这种方式里边我们筛选出来的就是Bob的点击访问事件啊,所以这两种方法得到的结果都是完全一样。这就是filter转换算子的使用方法。
我来说两句