Rxjava学习(二操作符)
操作符是为了解决对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对象。
特性:
- 它不必返回Observable对象返回的类型,你可以使用map操作符返回一个发出新的数据类型的observable对象。
- 可以对一个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.
- from(Iterable<? extends T> iterable)
- 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学习(二操作符)的更多相关文章
- RxJava学习笔记(操作符)
前言 上一篇文章介绍了RxJava的基础知识和简单实现,篇幅已经比较多了,所以把操作符(Operators)相关的内容放在这一篇.有了上一篇文章的基础,相信会比较容易理解操作符相关的内容了. 操作符( ...
- RxJava学习( 二)
1) Scheduler 的 API (一) 在RxJava 中,Scheduler ——调度器,相当于线程控制器,RxJava 通过它来指定每一段代码应该运行在什么样的线程.RxJava 已经内置了 ...
- Java编程思想学习(二) 操作符
1. 对象“赋值”:对一个对象进行操作时,我们真正操作的是对对象的引用.所以倘若“将一个对象赋值给另一个对象”,实际是将“引用”从一个地方复制到另一个地方.(引用于对象之间存在关联,但这种关联可以被改 ...
- Linq学习之操作符
一.环境搭建 下面将逐步搭建我们学习的环境,这个环境不仅仅是这次需要使用,以后的教程一样需要使用这个环境.所以请大家务必按照 搭建这里的环境否则会影响你后面的学习. 我们用到的几张表 通知消息表: 用 ...
- Python入门基础学习 二
Python入门基础学习 二 猜数字小游戏进阶版 修改建议: 猜错的时候程序可以给出提示,告诉用户猜测的数字偏大还是偏小: 没运行一次程序只能猜测一次,应该提供多次机会给用户猜测: 每次运行程序,答案 ...
- emberjs学习二(ember-data和localstorage_adapter)
emberjs学习二(ember-data和localstorage_adapter) 准备工作 首先我们加入ember-data和ember-localstorage-adapter两个依赖项,使用 ...
- ReactJS入门学习二
ReactJS入门学习二 阅读目录 React的背景和基本原理 理解React.render() 什么是JSX? 为什么要使用JSX? JSX的语法 如何在JSX中如何使用事件 如何在JSX中如何使用 ...
- TweenMax动画库学习(二)
目录 TweenMax动画库学习(一) TweenMax动画库学习(二) TweenMax动画库学习(三) Tw ...
- Hbase深入学习(二) 安装hbase
Hbase深入学习(二) 安装hbase This guidedescribes setup of a standalone hbase instance that uses the local fi ...
随机推荐
- B - Red and Black 问题思考
红黑地板问题 There is a rectangular room, covered with square tiles. Each tile is colored either red or bl ...
- 一个linux内核编译时遇到的perl语法导致的编译问题解决
在编译linux内核时,遇到了一个比较诡异的问题.具体log如下: Can't locate strict.pm in @INC (you may need to install the strict ...
- Liferay7 BPM门户开发之5: Activiti和Spring集成
参考文档: https://github.com/jbarrez/spring-boot-with-activiti-examplehttps://github.com/sxyx2008/spring ...
- 简单标签SimpleTag
想要开发自定义标签,大多数情况下都要重写doStartTag(),doAfterBody()和doEndTag()方法,并且还要知道SKIP_BODY,EVAL_BODY等等的变量代表着什么,在什么方 ...
- 原生js实现vue组件功能
在如今VUE盛行的情况下,我们一直在惊叹于VUE的组件的功能,却不知道,原生js早就已经支持了这个功能. 最近在公开课学到的,js还有很多很多需要探索学习. 下面是一个简单的例子 <!DOCTY ...
- CentOS 6.5 网络服务器功能的实现②:运用光盘(镜像)制作一个本地yum源
在用Linux安装软件时(rpm安装方式),有时会出现“包依赖”的现象.因此,我们可以用yum工具来实现一次性安装所有rpm工具包的功能. 实例:在此服务器上用yum的方式安装DHCP服务和TFTP服 ...
- Java并发编程笔记之CyclicBarrier源码分析
JUC 中 回环屏障 CyclicBarrier 的使用与分析,它也可以实现像 CountDownLatch 一样让一组线程全部到达一个状态后再全部同时执行,但是 CyclicBarrier 可以被复 ...
- C语言第四讲,typedef 关键字,以及作用域
C语言第四讲,typedef 关键字,以及作用域 一丶typedef关键字 在C语言中,有typedef 关键字,这个关键字的作用就是允许你为类型定义一个新的名字,也就是 起个别的名字 例如: typ ...
- 使用gitlab, jenkins搭建CI(持续集成)系统(3) -- 根据不同触发条件执行不同的构建任务
前面在jenkins中安装的gitlab hook支持不同的参数,具体可以参考gitlab hook文档https://github.com/jenkinsci/gitlab-hook-plugin# ...
- python文件处理b模式
执行环境:windows+Python3.51.rb模式,从文件中读取内容,得到的是bytes类型 因为我们使用的是b模式,所以在open函数中不能指定编码格式,所以打印出来的格式的二进制的格式,而我 ...