Rxjava学习(二操作符)

摘要:
map()运算符用于变换Observable对象。map运算符返回一个Observable对象,该对象支持链式调用。您可以在Observable对象上多次使用map运算符,最后将最简单的数据传递给Subscriber对象。

操作符是为了解决对Observable对象的变换的问题,操作符用于在Observable和最终的Subscriber之间修改Observable发出的事件

1.filter

  filter()操作符是可以对Observable流程的数据进行一层过滤处理,返回一个新的Observable,filter()返回为false的值将不会发出到Subscriber,我们来看下具体的代码

 1 Observable.just("2", "3").filter(new Func1<String, Boolean>() {
 2         @Override
 3         public Boolean call(String s) {
 4             if ("2".equals(s)) {
 5                 return true;
 6             }
 7             //只发送"2"到Subscriber
 8             return false;
 9         }
10     }).subscribe(new Action1<String>() {
11         @Override
12         public void call(String s) {
13             Log.i(TAG, "call3: " + s);
14         }
15 });

2.map  

①事件对象的直接变换;它是 RxJava最常用的变换;可以将Observable深入的对象1转换为对象2发送给Subscriber。

一个Observable对象上可以多次使用map操作符

 1  Observable.just("images/logo.png") // 输入类型 String
 2      .map(new Func1<String, Bitmap>() {
 3          @Override
 4          public Bitmap call(String filePath) { // 参数类型 String
 5              return getBitmapFromPath(filePath); // 返回类型 Bitmap
 6          }
 7      }).subscribe(new Action1<Bitmap>() {
 8         @Override
 9         public void call(Bitmap bitmap) { // 将修改的结果传到Subscriber中处理
10             showBitmap(bitmap);
11         }
12      });

②用来把一个事件转换为另一个事件。

map()操作符就是用于变换Observable对象的,map操作符返回一个Observable对象,这样就可以实现链式调用,在一个Observable对象上多次使用map操作符,最终将最简洁的数据传递给Subscriber对象。

特性:

  1. 它不必返回Observable对象返回的类型,你可以使用map操作符返回一个发出新的数据类型的observable对象。
  2. 可以对一个Observable多次使用map

用一个例子来练习:

//刚创建的Observable是String类型的
Observable.just("Hellp Map Operator")
.map(new Func1<String, Integer>() {
    @Override
    public Integer call(String s) {
        return 2015;//通过第一个map转成Integer
    }
}).map(new Func1<Integer, String>() {
    @Override
    public String call(Integer integer) {
        return String.valueOf(integer);//再通过第二个map转成String
    }
}).subscribe(new Action1<String>() {
    @Override
    public void call(String s) {
        System.out.println(s);
    }
});

3.flatMap

flatMap() 也和 map() 相同,也是把传入的参数转化之后返回另一个对象;和 map() 不同的是, flatMap() 中返回的是个 Observable 对象,并且这个 Observable 对象并不是被直接发送到了 Subscriber 的回调方法中。

         flatMap() 的原理:

       1. 使用传入的事件对象创建一个 Observable 对象;

       2. 并不发送这个 Observable, 而是将它激活,于是它开始发送事件;

       3. 每一个创建出来的 Observable 发送的事件,都被汇入同一个 Observable ,而这个 Observable 负责将这些事件统一交给 Subscriber 的回调方法。

       这三个步骤,把事件拆成了两级,通过一组新创建的 Observable 将初始的对象『铺平』之后通过统一路径分发了下去。

       扩展:由于可以在嵌套的Observable 中添加异步代码, flatMap() 也常用于嵌套的异步操作,例如嵌套的网络请求。

使用场景:

有方法根据输入的字符串返回一个List集合信息 Observable<List<String>> query(String text);
 假如不用flatMap()我们应该这样写:

 query("message")
      .subscribe(new Action1<List<String>>() {
            @Override
            public void call(List<String> mLists) {
              
              Observable.from(mLists)  
               .subscribe(new Action1<String>() {
                @Override
                public void call(String message) {
                      log.i(TAG,message);           
                }
             });      
          }
      }); 

使用flatMap()这样写:

query("Hello, world!")  
    .flatMap(new Func1<List<String>, Observable<String>>() {  
        @Override  
        public Observable<String> call(List<String> urls) {  
            return Observable.from(urls);  
        }  
    })  
    .subscribe(new Action1<String>() {
                @Override
                public void call(String message) {
                      log.i(TAG,message);           
                }
   });

4.From

from()接收一个集合作为输入,然后每次输出一个元素给subscriber.

  1. from(Iterable<? extends T> iterable)
  2. from(T[] array)

Demo

List<String> s = Arrays.asList("Java", "Android", "Ruby", "Ios", "Swift");
Observable.from(s).subscribe(new Action1<String>() {
    @Override
    public void call(String s) {
        System.out.println(s);
    }
});

Log:

Java
Android
Ruby
Ios
Swift

5.Do操作符

Do操作符是在Observable的生命周期的各个阶段加上一系列的回调监听

 

doOnEach --- Observable每发射一个数据的时候就会触发这个回调,不仅包括onNext还包括onError和onCompleted。
doOnNext --- 只有onNext的时候才会被触发
doOnError --- 只有onError发生的时候触发回调
doOnComplete --- 只有onComplete发生的时候触发回调
doOnSubscribe和DoOnUnSubscribe --- 在Subscriber进行订阅和反订阅的时候触发回调

doOnTerminate --- 在Observable结束前触发回调,无论是正常还是异常终止
finallyDo --- 在Observable结束后触发回调,无论是正常还是异常终止

 1 Observable.just(1,2,3)
 2         .doOnEach(new Action1<Notification<? super Integer>>() {
 3             @Override
 4             public void call(Notification<? super Integer> notification) {
 5                 Log.d(TAG,"doOnEach send" + notification);
 6             }
 7         })
 8         .doOnNext(new Action1<Integer>() {
 9             @Override
10             public void call(Integer integer) {
11                 Log.d(TAG,"doOnNext send" + integer);
12             }
13         })
14         .doOnCompleted(new Action0() {
15             @Override
16             public void call() {
17                 Log.d(TAG,"onCompleted");
18             }
19         })
20         .doOnSubscribe(new Action0() {
21             @Override
22             public void call() {
23                 Log.d(TAG,"onSubscribe");
24             }
25         })
26         .doOnUnsubscribe(new Action0() {
27             @Override
28             public void call() {
29                 Log.d(TAG,"onUnSubscribe");
30             }
31         })
32         .subscribe(new Action1<Integer>() {
33             @Override
34             public void call(Integer integer) {
35                 Log.d(TAG,"do:" + integer);
36             }
37         });

Rxjava学习(二操作符)第1张

免责声明:文章转载自《Rxjava学习(二操作符)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇ubuntu下git更改默认编辑器蓝牙协议分析(4)_IPv6 Over BLE介绍下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

JDBC数据类型、Java数据类型、标准sql类型

本概述是从《JDBCTM Database Access from JavaTM: A Tutorial and Annotated Reference》这本书中摘引来的。JavaSoft 目前正在准备这本书。这本书是一本教程,同时也是 JDBC 的重要参考手册,它将作为 Java 系列的组成部份,在 1997 年春季由 Addison-Wesley 出版...

JAVA对象克隆

   1> 为了获取对象的一份拷贝,我们可以利用Object类的clone()方法。 2> 在派生类中覆盖基类的clone(),并声明为public。3> 在派生类的clone()方法中,调用super.clone()。4> 在派生类中实现Cloneable接口。4> 没有抽象方法的接口叫标识接口。5> 为什么我们在派...

网络技能大赛A卷测试

  这个测试对我来言有些难度,短时间内做不了太多。首先是思路的理清,登录后的界面有好几种,而且公文的状态也有好几种。理清思路就花了一些时间 然后大致的框架做了做,然后将用户的增删改查还有公文的增删改查写了写。登录界面也完成了,不过不同角色登陆后的界面还没来得及做。主要就是功能太多,运用不熟练 数据库      bean层的基本信息 package c...

vba Excel连接数据库

PostgreSql: 第一步 在网上下载postres的驱动程序,之后安装,下载地址:https://www.devart.com/odbc/postgresql/download.html 第二步 创建ODBC数据源 点击“开始-》控制面板-》管理工具-》数据源(ODBC)-》用户DSN-》添加” 安装上图配置好之后写入VBA代码并导入包文件...

基于jmeter-dubbo协议压测实践

背景 为了满足公司业务发展及性能要求,公司技术架构在很多业务接口调用设计中引用到了dubbo协议调用方式,对于以前HTTP feign调用的接口转为dubbo泛化调用后,接口性能如何?有何影响?需要进行压测评估。为解决公司RPC dubbo协议调用压测问题,需升级jmeter压测组件,扩展压测协议支持。   Dubbo泛化调用原理 在进行dubbo协议接...

C#正则表达式合并连续空格为单个空格

第一种方法:       使用 System.Text.RegularExpressions.Regex.Replace()方法   string result = String.Empty;   string str = "Just     Test the  Method";   result = Regex.Replace(str, "\s{2,}"...