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

1.filter

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

 Observable.just("", "").filter(new Func1<String, Boolean>() {
@Override
public Boolean call(String s) {
if ("".equals(s)) {
return true;
}
//只发送"2"到Subscriber
return false;
}
}).subscribe(new Action1<String>() {
@Override
public void call(String s) {
Log.i(TAG, "call3: " + s);
}
});

2.map  

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

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

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

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

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 ;//通过第一个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结束后触发回调,无论是正常还是异常终止

 Observable.just(,,)
.doOnEach(new Action1<Notification<? super Integer>>() {
@Override
public void call(Notification<? super Integer> notification) {
Log.d(TAG,"doOnEach send" + notification);
}
})
.doOnNext(new Action1<Integer>() {
@Override
public void call(Integer integer) {
Log.d(TAG,"doOnNext send" + integer);
}
})
.doOnCompleted(new Action0() {
@Override
public void call() {
Log.d(TAG,"onCompleted");
}
})
.doOnSubscribe(new Action0() {
@Override
public void call() {
Log.d(TAG,"onSubscribe");
}
})
.doOnUnsubscribe(new Action0() {
@Override
public void call() {
Log.d(TAG,"onUnSubscribe");
}
})
.subscribe(new Action1<Integer>() {
@Override
public void call(Integer integer) {
Log.d(TAG,"do:" + integer);
}
});

Rxjava学习(二操作符)的更多相关文章

  1. RxJava学习笔记(操作符)

    前言 上一篇文章介绍了RxJava的基础知识和简单实现,篇幅已经比较多了,所以把操作符(Operators)相关的内容放在这一篇.有了上一篇文章的基础,相信会比较容易理解操作符相关的内容了. 操作符( ...

  2. RxJava学习( 二)

    1) Scheduler 的 API (一) 在RxJava 中,Scheduler ——调度器,相当于线程控制器,RxJava 通过它来指定每一段代码应该运行在什么样的线程.RxJava 已经内置了 ...

  3. Java编程思想学习(二) 操作符

    1. 对象“赋值”:对一个对象进行操作时,我们真正操作的是对对象的引用.所以倘若“将一个对象赋值给另一个对象”,实际是将“引用”从一个地方复制到另一个地方.(引用于对象之间存在关联,但这种关联可以被改 ...

  4. Linq学习之操作符

    一.环境搭建 下面将逐步搭建我们学习的环境,这个环境不仅仅是这次需要使用,以后的教程一样需要使用这个环境.所以请大家务必按照 搭建这里的环境否则会影响你后面的学习. 我们用到的几张表 通知消息表: 用 ...

  5. Python入门基础学习 二

    Python入门基础学习 二 猜数字小游戏进阶版 修改建议: 猜错的时候程序可以给出提示,告诉用户猜测的数字偏大还是偏小: 没运行一次程序只能猜测一次,应该提供多次机会给用户猜测: 每次运行程序,答案 ...

  6. emberjs学习二(ember-data和localstorage_adapter)

    emberjs学习二(ember-data和localstorage_adapter) 准备工作 首先我们加入ember-data和ember-localstorage-adapter两个依赖项,使用 ...

  7. ReactJS入门学习二

    ReactJS入门学习二 阅读目录 React的背景和基本原理 理解React.render() 什么是JSX? 为什么要使用JSX? JSX的语法 如何在JSX中如何使用事件 如何在JSX中如何使用 ...

  8. TweenMax动画库学习(二)

    目录            TweenMax动画库学习(一)            TweenMax动画库学习(二)            TweenMax动画库学习(三)            Tw ...

  9. Hbase深入学习(二) 安装hbase

    Hbase深入学习(二) 安装hbase This guidedescribes setup of a standalone hbase instance that uses the local fi ...

随机推荐

  1. [每天解决一问题系列 - 0013] 如何修改WiX Burn内置的窗口

    问题描述: 我们产品的burn安装包仅支持.net 3.5 sp1以上,在只有.net 2.0的机器上会给用户弹一个窗口,告诉用户为什么不能够安装的原因.本来burn已经内置了,但是在日文操作系统下, ...

  2. shell中mail发邮件的问题

    今天为了监控一下脚本,按照网上说的利用mail 发邮件,mail -s "error预警2" peien@1221.qq.com<'邮件内容',发现出现cc,不知道啥问题,也 ...

  3. 程序员、互联网从业者必读KK三大力作之《必然》总结

  4. mysql 查看建表语句

    show create table `table_name`; 结果如下:

  5. Windows10安装Docker

    一.Docker下载安装 一般情况下,我们可以从Docker官网docker下载安装文件,但是官方网站由于众所周知的原因,不是访问慢,就是下载慢.下载docker安装包动不动就要个把小时,真是极大的影 ...

  6. Python机器学习笔记:sklearn库的学习

    网上有很多关于sklearn的学习教程,大部分都是简单的讲清楚某一方面,其实最好的教程就是官方文档. 官方文档地址:https://scikit-learn.org/stable/ (可是官方文档非常 ...

  7. lightswitch 添加 TreeView 控件

    代码片段 <UserControl xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk&q ...

  8. php模拟post提交请求,调用接口

    /** * 模拟post进行url请求 * @param string $url * @param string $param */ function request_post($url = '', ...

  9. ASP .NET MVC HtmlHelper扩展——简化“列表控件”的绑定

    在众多表单元素中,有一类<select>元素用于绑定一组预定义列表.传统的ASP.NET Web Form中,它对应着一组重要的控件类型,即ListControl,我们经常用到DropDo ...

  10. IOS 获取的时间显示为NAN 解决方法

    var regTime= item.BeginDate.replace(/\-/g, "/"); ------ item.BeginDate 我的日期年月日的    (/\-/g, ...