RxJava算子系列传送门RxJava算子源码https://github.com/xiehui999/fuseProgramRxJava算子系列一RxJava算子系列二前言在上一篇文章中,我们介绍了一些Observable的创建和数据引入了转换运算符。一些数据转换操作符还是比较难理解的,但是相信如果敲代码,修改各种参数的值观察执行日志,相信还是很容易理解的。在官方网站上,为每个运营商提供了图例。如果你对文字的理解不够清晰,也可以参考插图来帮助理解。在本文中,我们将介绍一些常用的过滤运算符。RxJava中的过滤操作符也比较容易理解。好吧,让我们一起继续学习之旅吧。Filter这个操作符接收一个Func1参数,在这个参数中我们可以根据自己的判断条件来判断我们要过滤的数据。当数据通过判断条件时,返回true表示数据发出,否则不发出,所以会过滤掉我们想要的数据。如下,我们过滤掉不能被2整除的数。Integer[]ints={1,2,3,4,5,6,7,8,9};Observableobservable=Observable.from(ints).filter(newFunc1(){@OverridepublicBooleancall(Integerinteger){returninteger%2!=0;//返回true,不会被过滤掉,会发出数据,过滤掉返回false的值}});Action1action1=newAction1(){@Overridepublicvoidcall(Integeri){Log.e(TAG,"call:"+i);}};observable.subscribe(action1);输出日志信息call:1call:3call:5call:7call:9ofType运算符是过滤运算符的一种特殊形式。它过滤一个Observable,只返回指定类型的数据。比如当数据源有string和int数据时,我们可以使用这个操作符过滤掉字符串。下面的示例代码是Observable.just(0,"one",6,4,"two",8,"three",1,"four",0).ofType(String.class).subscribe(newSubscriber(){@OverridepublicvoidonCompleted(){Log.e(TAG,"onCompleted:ofType");}@OverridepublicvoidonError(Throwablee){Log.e(TAG,"onError:ofType");}@OverridepublicvoidonNext(Stringstring){Log.e(TAG,"onNext:ofType"+string);}});输出日志信息onNext:ofTypeoneonNext:ofTypetwoonNext:ofTypethreeonNext:ofTypefouronCompleted:ofType当然除了过滤基本类型的数据外,还可以过滤自定义类型的数据。First如果我们只对Observable发出的第一项数据感兴趣,或者满足某个条件的第一项数据,我们可以使用First运算符。Observable.just(10,11,12,13)??.first().subscribe(newAction1(){@Overridepublicvoidcall(Integerinteger){Log.e(TAG,integer+"");}});上面的日志只打印了一个值10。当然我们也可以给first传一个参数Fun1,指定一个条件如下Observable.just(10,11,12,13)??.first(newFunc1(){@OverridepublicBooleancall(Integerinteger){returninteger>12;}}).subscribe(newAction1(){@Overridepublicvoidcall(Integerinteger){Log.e(TAG,integer+"");}});此时输出的信息是满足integer>12data13的***项。firstOrDefault此运算符是第一个运算符的变体。主要是在没有数据发出时发出一个你在参数中指定的默认值。如下,它有两个重载方法。Observable.just(11,12,13)??.firstOrDefault(10).subscribe(newAction1