当前位置: 首页 > 科技观察

RxJava算子系列三(下)

时间:2023-03-13 15:52:02 科技观察

接上文TakeTake算子可以修改Observable的行为,只返回之前的N条数据,然后发出完成通知,忽略剩余数据。Observable.range(1,8).take(4).subscribe(newSubscriber(){@OverridepublicvoidonNext(Integeritem){Log.e(TAG,"Next:"+item);}@OverridepublicvoidonError(Throwableerror){Log.e(TAG,"Error:"+error.getMessage());}@OverridepublicvoidonCompleted(){Log.e(TAG,"complete.");}});输出日志信息Next:1Next:2Next:3Next:4Completetake和skip一样,还有另外两个重载方法take(longtime,TimeUnitunit)和take(longtime,TimeUnitunit,Schedulerscheduler),分别在计算调度器上执行默认。take还有一个变体算子TakeLast,takeLastBuffer的具体执行效果可以自己编码。Debounce算子是指在传输数据之前经过指定的时间后传输数据,这听起来有点混乱。你可以理解为源Observable区间生成的结果是经过过滤的。如果在此指定的时间间隔内没有其他结果生成,则将结果提交给订阅者,否则忽略该结果。原理有点像光学防抖上的代码Observable.range(1,8).take(4).subscribe(newSubscriber(){@OverridepublicvoidonNext(Integeritem){Log.e(TAG,"Next:"+item);}@OverridepublicvoidonError(Throwableerror){Log.e(TAG,"Error:"+error.getMessage());}@OverridepublicvoidonCompleted(){Log.e(TAG,"complete.");}});输出信息onNext:4onNext:5onNext:6onNext:7onNext:8onNext:9onCompleted:输出的数据不一定相同,可能从5开始。Distinct比较好理解。它过滤掉重复数据,只允许未传输的数据项通过。示例代码Observable.just(0,0,6,4,2,8,2,1,9,0).distinct().subscribe(newSubscriber(){@OverridepublicvoidonCompleted(){Log.e(TAG,"onCompleted:Distinct");}@OverridepublicvoidonError(Throwablee){Log.e(TAG,"onError:Distinct");}@OverridepublicvoidonNext(Integerinteger){Log.e(TAG,"onNext:Distinct"+整数);}});输出日志信息onNext:Distinct0onNext:Distinct6onNext:Distinct4onNext:Distinct2onNext:Distinct8onNext:Distinct1onNext:Distinct9onCompleted:DistinctElementAt该算子获取原始Observable发出的数据序列指定索引位置的数据项,然后作为自己的**发出*数据。向它传递一个从0开始的索引,它将发出原始Observable序列中该索引处的值,如果你向elementAt传递一个值为4的值,那么它将发出第5个项目。下面的示例代码Observable.just(0,0,6,4,2,8,2,1,9,0).elementAt(4).subscribe(newSubscriber(){@OverridepublicvoidonCompleted(){Log.e(TAG,"onCompleted:ElementAt");}@OverridepublicvoidonError(Throwablee){Log.e(TAG,"onError:ElementAt");}@OverridepublicvoidonNext(Integerinteger){Log.e(TAG,"onNext:ElementAt"+整数);}});输出日志信息onNext:ElementAt2onCompleted:ElementAtIgnoreElementsoperator抑制了原始Observable发出的所有数据,只允许其终止通知(onError或onCompleted)通过,使用该operator的onNext()方法将不会执行。Observable.just(1,2,3).ignoreElements().subscribe(newSubscriber(){@OverridepublicvoidonCompleted(){Log.e(TAG,"onCompleted");}@OverridepublicvoidonError(Throwablee){Log.e(TAG,"onError");}@OverridepublicvoidonNext(Integerinteger){Log.e(TAG,"onNext");}});执行后只会输出onCompleted。这个操作符的效果就像empty()方法创建了一个空的Observable,只有onCompleted()方法会被执行。区别在于ignoreElements处理的是数据源,而empty()创建的是Observable。