RxJava操作符系列二(上)

在上篇文章RxJava操作符系列一我们介绍的操作符几乎都是创建被观察者的操作符,那么今天的这篇文章就介绍一下经常用到的转换操作符。话不多说,开始上车。

Map

该操作符是对原始Observable发射的每一项数据运用一个函数,然后返回一个发射这些结果的Observable。

例如我们有一个整形数组的数据,当大于5时输出为true,则代码实现


  1. Integer[] integers = {0, 9, 6, 4, 8}; 
  2.         Observable.from(integers).map(new Func1() { 
  3.             @Override 
  4.             public Boolean call(Integer integer) { 
  5.                 Log.e(TAG, "call: "+integer); 
  6.                 return (integer > 5); 
  7.             } 
  8.         }).subscribe(new Subscriber() { 
  9.             @Override 
  10.             public void onCompleted() { 
  11.                 Log.e(TAG, "onCompleted: "); 
  12.             } 
  13.   
  14.             @Override 
  15.             public void onError(Throwable e) { 
  16.                 Log.e(TAG, "onError: "); 
  17.             } 
  18.   
  19.             @Override 
  20.             public void onNext(Boolean aBoolean) { 
  21.                 Log.e(TAG, "onNext: "+aBoolean); 
  22.             } 
  23.         });  

日志输出信息


  1. call: 0 
  2. onNext: false 
  3. call: 9 
  4. onNext: true 
  5. call: 6 
  6. onNext: true 
  7. call: 4 
  8. onNext: false 
  9. call: 8 
  10. onNext: true 
  11. onCompleted:  

对于map,他可以将将数据源变换为你想要的类型,比如,你想获取有一个Student对象(里面age,name属性)那么我们可以通过map只获取name。接下来。我们再举个例子,我们根据一个图片路径获取图片并将图片设置到ImageView,然后将ImageView加的我们的布局中。


  1. String path = Environment.getExternalStorageDirectory()+ File.separator+"aaa.jpg"; 
  2.         Observable.just(path) 
  3.                 .subscribeOn(Schedulers.io()) 
  4.                 .map(new Func1() { 
  5.                     @Override 
  6.                     public Bitmap call(String s) { 
  7.                         Bitmap bitmap = BitmapFactory.decodeFile(s); 
  8.                         Log.e(TAG, "call: Bitmap"+bitmap); 
  9.                         return bitmap; 
  10.                     } 
  11.                 }).map(new Func1() { 
  12.             @Override 
  13.             public ImageView call(Bitmap bitmap) { 
  14.                 Log.e(TAG, "call: ImageView"); 
  15.                 ImageView imageView = new ImageView(getActivity()); 
  16.                 LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); 
  17.                 imageView.setLayoutParams(params); 
  18.                 imageView.setImageBitmap(bitmap); 
  19.                 return imageView; 
  20.             } 
  21.         }).observeOn(AndroidSchedulers.mainThread()) 
  22.                 .subscribe(new Subscriber() { 
  23.                     @Override 
  24.                     public void onCompleted() { 
  25.                         Log.e(TAG, "onCompleted: "); 
  26.                     } 
  27.                     @Override 
  28.                     public void onError(Throwable e) { 
  29.                         Log.e(TAG, "onError: "); 
  30.                     } 
  31.   
  32.                     @Override 
  33.                     public void onNext(ImageView imageView) { 
  34.                         Log.e(TAG, "onNext: "); 
  35.                         layout.addView(imageView); 
  36.                     } 
  37.                 });  

Cast

该操作符就是做一些强制类型转换操作的。例如,当我们在页面跳转时数据对象往往是序列化的,当我们在新的页面收到数据后就要强制转换为我们想要的类型。cast操作符也可以实现这样的功能。如下


  1. Observable.just(serializable).cast(FileInfo.class).subscribe(new Subscriber() { 
  2.             @Override 
  3.             public void onCompleted() { 
  4.                 Log.e(TAG, "onCompleted: " ); 
  5.             } 
  6.   
  7.             @Override 
  8.             public void onError(Throwable e) { 
  9.                 Log.e(TAG, "onError: " ); 
  10.             } 
  11.   
  12.             @Override 
  13.             public void onNext(FileInfo fileInfo) { 
  14.                 Log.e(TAG, "onNext: "+fileInfo.toString()); 
  15.                 tv1.append("\n"+fileInfo.toString()); 
  16.             } 
  17.         });  

不过在该操作符实际用途并没有那么的广泛,很少用到,当然这个操作符也可以达到java 中instanceof相同的作用,用于类型检查,当不是该类型就会执行onError()方法。

FlatMap

该操作符与map操作符的区别是它将一个发射数据的Observable变换为多个Observables,然后将它们发射的数据合并后放进一个单独的Observable.


  1. Integer[] integers = {1, 2, 3}; 
  2.         Observable.from(integers).flatMap(new Func1>() { 
  3.             @Override 
  4.             public Observable call(final Integer integer) { 
  5.                 return Observable.create(new Observable.OnSubscribe() { 
  6.                     @Override 
  7.                     public void call(Subscriber super String> subscriber) { 
  8.                         Log.e(TAG, "call: FlatMap " + Thread.currentThread().getName()); 
  9.                         try { 
  10.                             Thread.sleep(200); 
  11.                             subscriber.onNext(integer + 100 + " FlatMap"); 
  12.                             subscriber.onCompleted(); 
  13.                         } catch (InterruptedException e) { 
  14.                             e.printStackTrace(); 
  15.                             subscriber.onError(e); 
  16.                         } 
  17.                     } 
  18.                 }).subscribeOn(Schedulers.newThread()); 
  19.             } 
  20.         }).observeOn(AndroidSchedulers.mainThread()) 
  21.                 .subscribe(new Subscriber() { 
  22.                     @Override 
  23.                     public void onCompleted() { 
  24.                         Log.e(TAG, "onCompleted: FlatMap"); 
  25.                     } 
  26.   
  27.                     @Override 
  28.                     public void onError(Throwable e) { 
  29.                         Log.e(TAG, "onError: FlatMap"); 
  30.                     } 
  31.   
  32.                     @Override 
  33.                     public void onNext(String s) { 
  34.                         Log.e(TAG, "onNext: FlatMap " + s); 
  35.                     } 
  36.                 });  

打印日志信息


  1. call: FlatMap RxNewThreadScheduler-2 
  2. call: FlatMap RxNewThreadScheduler-3 
  3. call: FlatMap RxNewThreadScheduler-4 
  4. onNext: FlatMap 101 FlatMap 
  5. onNext: FlatMap 102 FlatMap 
  6. onNext: FlatMap 103 FlatMap 
  7. onCompleted: FlatMap  

ConcatMap

该操作符是类似于最简单版本的flatMap,但是它按次序连接而不是合并那些生成的Observables,然后产生自己的数据序列.将上述flatMap代码更改如下


  1. Integer[] integers = {1, 2, 3}; 
  2.         Observable.from(integers).concatMap(new Func1>() { 
  3.             @Override 
  4.             public Observable call(final Integer integer) { 
  5.                 return Observable.create(new Observable.OnSubscribe() { 
  6.                     @Override 
  7.                     public void call(Subscriber super String> subscriber) { 
  8.                         Log.e(TAG, "call:2 ConcatMap " + Thread.currentThread().getName()); 
  9.                         try { 
  10.                             Thread.sleep(200); 
  11.                             subscriber.onNext(integer + 100 + " ConcatMap"); 
  12.                             subscriber.onCompleted(); 
  13.                         } catch (InterruptedException e) { 
  14.                             e.printStackTrace(); 
  15.                             subscriber.onError(e); 
  16.                         } 
  17.                     } 
  18.                 }).subscribeOn(Schedulers.newThread()); 
  19.             } 
  20.         }).observeOn(AndroidSchedulers.mainThread()) 
  21.                 .subscribe(new Subscriber() { 
  22.                     @Override 
  23.                     public void onCompleted() { 
  24.                         Log.e(TAG, "onCompleted: ConcatMap"); 
  25.                     } 
  26.   
  27.                     @Override 
  28.                     public void onError(Throwable e) { 
  29.                         Log.e(TAG, "onError: ConcatMap"); 
  30.                     } 
  31.   
  32.                     @Override 
  33.                     public void onNext(String s) { 
  34.                         Log.e(TAG, "onNext: ConcatMap " +s); 
  35.                     } 
  36.                 });  

接下文

本文作者:佚名

来源:51CTO

时间: 2025-01-01 14:54:32

RxJava操作符系列二(上)的相关文章

RxJava操作符系列二(下)

接上文 输出日志信息 call:2 ConcatMap RxNewThreadScheduler-5  onNext: ConcatMap 101 ConcatMap  call:2 ConcatMap RxNewThreadScheduler-6  onNext: ConcatMap 102 ConcatMap  call:2 ConcatMap RxNewThreadScheduler-7  onNext: ConcatMap 103 ConcatMap  onCompleted: Conc

RxJava操作符系列三(上)

RxJava操作符系列传送门 RxJava操作符源码 https://github.com/xiehui999/fuseProgram RxJava操作符系列一 RxJava操作符系列二 前言 在之前的文章,我们介绍了一些Observable的创建以及数据转换的操作符,其中的一些数据转换的操作符理解还是有一定的难度的,但是相信如果敲一遍代码并且修改各种参数的值,去观察执行的日志,相信还是很容易的理解的.在官网,每个操作符都给出了图例,如果你对文字的理解不够清楚明白,也可以去参考图示帮助自己理解.

RxJava操作符系列三(下)

接上文 Take Take操作符可以修改Observable的行为,只返回前面的N项数据,然后发射完成通知,忽略剩余的数据. Observable.range(1,8)              .take(4)              .subscribe(new Subscriber<Integer>() {            @Override            public void onNext(Integer item) {               Log.e(TAG

Android高效率编码-第三方SDK详解系列(二)——Bmob后端云开发,实现登录注册,更改资料,修改密码,邮箱验证,上传,下载,推送消息,缩略图加载等功能

Android高效率编码-第三方SDK详解系列(二)--Bmob后端云开发,实现登录注册,更改资料,修改密码,邮箱验证,上传,下载,推送消息,缩略图加载等功能 我的本意是第二篇写Mob的shareSDK分享组件的,奈何需要去注册各平台的账号,还要审核,有些审核还挺久,就没办法,改为写这个Bmob了,相信大家对Bmob都是挺期待的吧,因为他作为Android后端的实现很好的支持,国内很多软件都在使用它,他的功能也是特别神奇,这里就不一一细说了,我们用实际的例子来见证他的神奇 官网:http://w

WorldWind系列二:擒贼先擒王篇1

有了WorldWind系列一的基础,我们已经可以进行正常调试运行啦!可以先操作看看软件的功能吧,这样我们才可以知道WorldWind有哪些功能等待我们学习的. 开始我们的"WorldWind系列二:擒贼先擒王"分析WorldWind主窗体,从Main函数入口一步步解析学习.至少对于我来说,里面有很多知识要学的.(补充一下:无法进入WorldWind.cs窗体的设计界面,这个问题我早就发现了,但没解决,我们根据功能直接看代码吧) 1.使用System.Version在内部,读取软件版本信

iOS开发UINavigation系列二——UINavigationItem

iOS开发UINavigation系列二--UINavigationItem 一.引言         UINavigationItem是导航栏上用于管理导航项的类,在上一篇博客中,我们知道导航栏是通过push与pop的堆栈操作来对item进行管理的,同样,每一个Item自身也有许多属性可供我们进行自定制.这篇博客,主要讨论UINavigationItem的使用方法. UINavigationBar:http://my.oschina.net/u/2340880/blog/527706. 二.来

VSTO之旅系列(二):创建Excel解决方案

原文:VSTO之旅系列(二):创建Excel解决方案   本专题概要 引言 创建VSTO项目 Excel对象模型 创建Excel外接程序 创建Excel文档级自定义项 小结   一.引言 也许很多朋友都没有听说过VSTO这个东西的,本人之前也同样也不知道的,但是由于工作的原因接触了这方面,由于VSTO方面国内的资料比较少,本人刚开始学习的时候都是参考MSDN的,但是上面很多资料都是英文的,可能学习起来会比较慢点,所以本人把最近一段时间学习的内容记录下来,一来是作为一个巩固的学习笔记,二来希望这些

iOS中CoreData数据管理系列二——CoreData框架中三个重要的类

iOS中CoreData数据管理系列二--CoreData框架中三个重要的类 一.引言     在上一篇博客中,介绍了iOS中使用CoreData框架设计数据模型的相关步骤.CoreData框架中通过相关的类将数据--数据模型--开发者无缝的衔接起来.NSManagedObjectModel对应数据模型,即上篇博客中我们创建的.xcdatamodeld文件:NSPersistentStoreCoordinator相当于数据库与数据模型之间的桥接器,通过NSPersistentStoreCoord

系列二VS项目软件配置工具介绍

原文:系列二VS项目软件配置工具介绍 Svn和VisualSvn介绍      在使用TortoiseSvn(SVN客户端)+ AnkhSvn(VS2008插件) +VisualSvn Server(版本控制服务器)进行源代码版本控制前,有必要先了解下Subversion(Svn).     Svn(Subversion)是近年来崛起的版本管理工具,是CVS的接班人.目前,绝大多数开源软件都使用Svn作为代码版本管理软件.      Svn客户端: Subversion的客户端有两类,一类是we