RxJavaOperator源码传送门https://github.com/xiehui999/fuseProgram在上一篇RxJavaOperator系列1中,我们介绍的operators几乎都是observeroperator创建的,所以今天的文章将介绍经常使用的转换运算符。话不多说,我们上车吧。Map运算符将函数应用于原始Observable发射的每个项目,并返回发射这些结果的Observable。比如我们有一个整型数据数组,当大于5时输出为真,代码实现了Integer[]integers={0,9,6,4,8};Observable.from(integers)。map(newFunc1(){@OverridepublicBooleancall(Integerinteger){Log.e(TAG,"call:"+integer);return(integer>5);}}).subscribe(newSubscriber(){@OverridepublicvoidonCompleted(){Log.e(TAG,"onCompleted:");}@OverridepublicvoidonError(Throwablee){Log.e(TAG,"onError:");}@OverridepublicvoidonNext(BooleanaBoolean){Log.e(TAG,"onNext:"+aBoolean);}});log输出信息call:0onNext:falsecall:9onNext:truecall:6onNext:truecall:4onNext:falsecall:8onNext:trueonCompleted:对于map,他可以把数据源转化成你想要的类型,比如你想得到一个Student对象(里面的age,name属性)那么我们通过map只能得到name。下一个。再举个例子,我们根据一个图片路径获取图片并将图片设置为ImageView,然后将ImageView添加到我们的布局中。Stringpath=Environment.getExternalStorageDirectory()+File.separator+"aaa.jpg";Observable.just(path).subscribeOn(Schedulers.io()).map(newFunc1(){@OverridepublicBitmapcall(Strings){Bitmapbitmap=BitmapFactory.decodeFile(s);Log.e(TAG,"call:Bitmap"+bitmap);returnbitmap;}}).map(newFunc1(){@OverridepublicImageViewcall(Bitmapbitmap){Log.e(TAG,"call:ImageView");ImageViewimageView=newImageView(getActivity());LinearLayout.LayoutParamsparams=newLinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.LayoutParams.WRAP_CONTENT);imageView.setLayoutParams(参数);imageView.setImageBitmap(位图);returnimageView;}})。observeOn(AndroidSchedulers.mainThread()).subscribe(newSubscriber(){@OverridepublicvoidonCompleted(){Log.e(TAG,"onCompleted:");}@OverridepublicvoidonError(Throwablee){Log.e(TAG,"onError:");}@OverridepublicvoidonNext(ImageViewimageView){Log.e(TAG,"onNext:");layout.addView(图像视图);}});Cast这个操作符就是做一些强制性的类型转换操作。比如我们在页面跳转的时候,数据对象往往是序列化的。当我们在新页面上接收到数据时,我们必须将其强制为我们想要的类型。cast操作符也可以实现这样的功能。Observable.just(serializable).cast(FileInfo.class).subscribe(newSubscriber(){@OverridepublicvoidonCompleted(){Log.e(TAG,"onCompleted:");}@OverridepublicvoidonError(Throwablee){Log.e(TAG,"onError:");}@OverridepublicvoidonNext(FileInfofileInfo){Log.e(TAG,"onNext:"+fileInfo.toString());tv1.append("\n"+fileInfo.toString());}});但是,这个运算符的实际使用并没有那么广泛,很少有人使用。当然这个操作符也可以达到java中instanceof一样的效果,用于类型检查。当不是这种类型时,就会执行onError()方法。FlatMap算子和map算子的区别在于,它将一个发射数据的Observable转化为多个Observable,然后将它们发射的数据合并为一个Observable.Integer[]integers={1,2,3};Observable.from(整数).flatMap(newFunc1>(){@OverridepublicObservablecall(finalIntegerinteger){returnObservable.create(newObservable.OnSubscribe(){@Overridepublicvoidcall(SubscribersuperString>subscriber){Log.e(TAG,"call:FlatMap"+Thread.currentThread().getName());try{Thread.sleep(200);subscriber.onNext(integer+100+"FlatMap");subscriber.onCompleted();}catch(InterruptedExceptione){e.printStackTrace();subscriber.onError(e);}}}).subscribeOn(Schedulers.newThread());}}).observeOn(AndroidSchedulers.mainThread()).subscribe(newSubscriber(){@OverridepublicvoidonCompleted(){Log.e(TAG,"onCompleted:FlatMap");}@OverridepublicvoidonError(Throwablee){Log.e(TAG,"onError:FlatMap");}@OverridepublicvoidonNext(Strings){Log.e(TAG,"onNext:FlatMap"+s);}});打印日志信息call:FlatMapRxNewThreadScheduler-2call:FlatMapRxNewThreadScheduler-3call:FlatMapRxNewThreadScheduler-4onNext:FlatMap101FlatMaponNext:FlatMap102FlatMaponNext:FlatMap103FlatMaponCompleted:FlatMapConcatMap这个操作符类似于最简单版本的flatMap,但它是顺序连接而不是合并那些生成的Observable,然后产生自己的数据序列。上面的flatMap代码变化如下Integer[]integers={1,2,3};Observable.from(integers).concatMap(newFunc1>(){@OverridepublicObservablecall(finalIntegerinteger){returnObservable.create(newObservable.OnSubscribe(){@Overridepublicvoidcall(SubscribersuperString>subscriber){Log.e(TAG,"call:2ConcatMap"+Thread.currentThread().getName());try{Thread.sleep(200);subscriber.onNext(integer+100+"ConcatMap");subscriber.onCompleted();}catch(InterruptedExceptione){e.printStackTrace();subscriber.onError(e);}}}).subscribeOn(Schedulers.newThread());}}).observeOn(AndroidSchedulers.mainThread()).subscribe(newSubscriber(){@OverridepublicvoidonCompleted(){Log.e(TAG,"onCompleted:ConcatMap");}@OverridepublicvoidonError(Throwablee){Log.e(TAG,"onError:ConcatMap");}@OverridepublicvoidonNext(Strings){Log.e(TAG,"onNext:ConcatMap"+s);}});继续
