RxJava事件流变换者--操作符
对于Rxjava来说,操作符是它的一个非常重要的概念,如官网:

而上节上也贴了一下都有哪些操作符,其实还不少,所以有必要仔细学习一下关于操作符这块的东东,那操作符在Rxjava中扮演着什么样的角色呢,下面用一个形象的举例来说明:
在Rxjava中,如果把整个事件流看作是工厂的流水线,Observable就是原料,Observer就是我们的产品经理,这个产品是怎么交到我们的产品经理呢?中间很重要的就是工人,也就是Operator(操作符),它负责在Observable发出的事件和Observable的响应之间做一些处理。
光说不练假把式,下面用代码用上几个操作符先来感受【具体细节之后会慢慢去学】下Rxjava中的操作符强大之处,具体的操作符会在未来仔细去学,这里先初步有个印象既可。
场景一:根据某个学生的信息,获取他所在的班级的所有学生
还是按照上一次的流程来:
①、创建被观察者Observable

②、创建观察者Observer
/**
* 场景:根据某个学生的信息,获取他所在的班级的所有学生
*/
public class RxJavaOperator { @SuppressWarnings("serial")
static List<Student> students = new ArrayList<Student>() {
{
add(new Student("张三", 29));
add(new Student("李四", 23));
add(new Student("王五", 25));
}
}; static Observable<Student> query(String name, int age) {
Student student = new Student(name, age);
return Observable.just(student);
} public static void main(String[] args) {
testOperator();
} @SuppressWarnings({ "unchecked", "rawtypes" })
private static void testOperator() {
// 创建被观察者Observable
Observable studentObservable = query("李四", 23); // 创建观察者Observer
Observer<Student> observer = new Observer<Student>() { @Override
public void onCompleted() {
System.out.println("onCompleted()");
} @Override
public void onError(Throwable e) { } @Override
public void onNext(Student t) {
System.out.println("onNext() value = " + t);
}
};
} }
③、被观察者订阅(subscribe)观察者
/**
* 场景:根据某个学生的信息,获取他所在的班级的所有学生
*/
public class RxJavaOperator { @SuppressWarnings("serial")
static List<Student> students = new ArrayList<Student>() {
{
add(new Student("张三", 29));
add(new Student("李四", 23));
add(new Student("王五", 25));
}
}; static Observable<Student> query(String name, int age) {
Student student = new Student(name, age);
return Observable.just(student);
} static Observable<Student> getAllStudents(Student student) {
return Observable.from(students);//这里采用了from操作符
} public static void main(String[] args) {
testOperator();
} @SuppressWarnings({ "unchecked", "rawtypes" })
private static void testOperator() {
// 创建被观察者Observable
Observable studentObservable = query("李四", 23); // 创建观察者Observer
Observer<Student> observer = new Observer<Student>() { @Override
public void onCompleted() {
System.out.println("onCompleted()");
} @Override
public void onError(Throwable e) { } @Override
public void onNext(Student t) {
System.out.println("onNext() value = " + t);
}
}; // 被观察者订阅(subscribe)观察者
studentObservable.flatMap(new Func1<Student, Observable<Student>>() {//这里采用了flatMap操作符 @Override
public Observable<Student> call(Student student) {
return getAllStudents(student);
}
}).subscribe(observer);
} }
编译运行:

上面感受一下就行,不用纠结太多细节,其中用到了just、from、flatMap、subscribe操作符,这些常用操作符之后会再细细学~
场景二:找出Sdcard上所有".png"格式的文件
这里将开发工具切到android studio上来,新建一个工程,并添加Rxjava的依赖:



基于场景一的代码对其进行扩展,首先先获得sdcard的根据目录文件:

然后还是按照标准的步骤去写:
①、创建被观察者Observable
这里为了获得满足条件的文件名称,用到了多个操作符来达到目的,体会下:

②、创建观察者Observer
③、被观察者订阅(subscribe)观察者
private void searchFiles() {
String basePath = Environment.getExternalStorageDirectory().getPath();
File rootFile = new File(basePath);
// 创建被观察者Observable
Observable observable = Observable.just(rootFile)
.flatMap(new Func1<File, Observable<File>>() {//进行遍历
@Override
public Observable<File> call(File file) {
return listFiles(file);
}
})
.filter(new Func1<File, Boolean>() {//这时会对文件进行一一判断过滤
@Override
public Boolean call(File file) {
Log.e("cexo", "filter() file = " + file.getName());
return file.getName().endsWith(".png");
}
})
.map(new Func1<File, String>() {//最后如果条件满足的文件则会传到这,最后返回文件名
@Override
public String call(File file) {
return file.getName();
}
});
// 创建观察者Observer
Observer<String> observer = new Observer<String>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(String s) {
Log.e("cexo", "onNext() s = " + s);
}
};
// 被观察者订阅(subscribe)观察者
observable.subscribe(observer);
}
编译运行:

下面在sdcard上放入几张png图片文件,然后再运行:

但是由于现实sdcard可能png的图片非常多,如果每发现一个就打印出来貌似不太好,有木有过滤到之后放到一个集合当中,最终一次性输出出来呢?当然有,那就再次体现Rxjava操作符强大之处的时机来了,修改代码如下:

但是!!!目前输出还是一个个输出的,这里还需要观察者的泛形数据类型,那需要改成啥呢?先看一下toList()操作符的源码返回的是:

所以修改观察者的泛形数据类型为:
private void searchFiles() {
String basePath = Environment.getExternalStorageDirectory().getPath();
File rootFile = new File(basePath);
// 创建被观察者Observable
Observable observable = Observable.just(rootFile)
.flatMap(new Func1<File, Observable<File>>() {//进行遍历
@Override
public Observable<File> call(File file) {
return listFiles(file);
}
})
.filter(new Func1<File, Boolean>() {//这时会对文件进行一一判断过滤
@Override
public Boolean call(File file) {
Log.e("cexo", "filter() file = " + file.getName());
return file.getName().endsWith(".png");
}
})
.map(new Func1<File, String>() {//最后如果条件满足的文件则会传到这,最后返回文件名
@Override
public String call(File file) {
return file.getName();
}
})
.toList();
// 创建观察者Observer
Observer<List<String>> observer = new Observer<List<String>>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(List<String> list) {
Log.e("cexo", "onNext() s = " + list);
}
};
// 被观察者订阅(subscribe)观察者
observable.subscribe(observer);
}
编译运行:

最后对于Rxjava的实现还可以简化一下,看起来更加链式,更加舒服,如下:

可能这时大家会想到,那这个方法得在异步去执行吧,当执行完成之后的数据应该得在ui线程中去进行显示处理,那这个在哪里体现呢?当然是在后面会学习到的,会有专门的线程控制,慢慢学!!
对于这篇写的代码欣赏欣赏既可,可能看着还是一头雾水,这是因为还木有仔细去学习这些细节,这里主要是展示rxjava的操作符的魅力所在,能感受到那就目的达到了,具体细节之后再慢慢学!
RxJava事件流变换者--操作符的更多相关文章
- RxJava【变换】操作符 map flatMap concatMap buffer MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- RxJava系列之二 变换类操作符具体解释1
1.回想 上一篇文章我们主要介绍了RxJava , RxJava 的Observables和 RxJava的just操作符.以及RxJava一些经常使用的操作. 没看过的抓紧点我去看吧. 事实上RxJ ...
- js事件捕获,事件冒泡,事件委托以及DOM事件流
一:DOM事件流: 事件流是从页面接收事件的顺序,DOM2级事件规定事件流包括三个阶段: ①事件捕获阶段:用意在于事件达到目标之前捕获它,在事件捕获阶段事件流模型:document→html→body ...
- 事件流处理框架NEsper for .NET z
复合事件处理(Complex Event Processing)介绍提到了开源的Esper,NEsper 是一个事件流处理(Event Stream Processing,ESP)和复杂事件处理(Co ...
- HTML 事件(三) 事件流与事件委托
本篇主要介绍HTML DOM中的事件流和事件委托. 其他事件文章 1. HTML 事件(一) 事件的介绍 2. HTML 事件(二) 事件的注册与注销 3. HTML 事件(三) 事件流与事件委托 4 ...
- 浅析JavaScript事件流——冒泡
一.什么是事件冒泡流 我们知道事件流指的是从页面中接受事件的顺序. 为了形象理解事件冒泡,可以想象三军主将诸葛亮,在帐内运筹帷幄,眼观六路耳听八方,这时候前方的战事情况就需要靠传令兵来传达,当第一位传 ...
- js事件流
event:事件对象,当一个事件发生的时候,和当前这个对象发生的这个事件有关的一些详细的信息都会被临时保存在一个指定地方-event对象,供我们在需要调用.event对象必须是在一个事件调用的函数里 ...
- javaScript事件(一)事件流
一.事件 事件是用户或浏览器自身执行的某种动作,如click,load和mouseover都是事件的名字.事件是javaScript和DOM之间的桥梁.你若触发,我便执行——事件发生,调用它的处理函数 ...
- 理解DOM事件流的三个阶段
本文主要解决两个问题: 1.什么是事件流 2.DOM事件流的三个阶段 事件流之事件冒泡与事件捕获 在浏览器发展的过程中,开发团队遇到了一个问题.那就是页面中的哪一部分拥有特定的事件? 可以想象画在一张 ...
随机推荐
- Fabric1.4 背书策略 .yam文件
{ identities: [ // 以下几项自动编号为[0,1,2] { role: { name: "member", mspId: "peerOrg1" ...
- docker国内镜像加速
在/etc/docker/daemon.json中添加内容: { "registry-mirrors": ["https://registry.docker-cn.c ...
- linux报错Loading mirror speeds from cached hostfile解决方法
首先本人当时也是遇到这个问题,首先配置了虚拟机的 yum,移步这篇博客https://www.cnblogs.com/xuzhaoyang/p/11239096.html 然后在进行了如下操作 首先还 ...
- Beanutils.copyProperties( )用法及重写提高效率
参考地址:https://blog.csdn.net/w05980598/article/details/79134379 待研究中.....
- POJ 1742 (单调队列优化多重背包+混合背包)
(点击此处查看原题) 题意分析 给你n种不同价值的硬币,价值为val[1],val[2]...val[n],每种价值的硬币有num[1],num[2]...num[n]个,问使用这n种硬币可以凑齐[1 ...
- 用函数来编写实现strlen()函数功能
strlen( )函数: 测试字符串实际长度的函数,它的返回值是字符串中字符的个数(不包含’\0’) //strlen( )函数:测试字符串实际长度的函数,它的返回值是字符串中字符的个数(不包含’\0 ...
- Spring集成kafka,消费者运行时内存占用会一直增长
Spring集成kafka,消费者运行时内存占用会一直增长? 20C 本人用Spring集成kafka消费者,发布运行时内存占用会一直升高,最后程序挂掉.请各位大神看看,提供解决方法 以下是我的配置文 ...
- 怎样查看 MySQL 版本号
1. 在命令行中直接查看版本号 mysql -V 2. 在 mysql --help 中查找与版本相关的信息 mysql --help | grep Ver 3. 在mysql命令行里面查看版本信息 ...
- Javascript中new的作用
关于js中new关键字的理解,先来看个例子:像这样创建实例时使用new与不使用new有什么区别????function ParasiticPerson(name, age, job) { var ...
- CF336C-Vasily the Bear and Sequence题解--贪心
题目链接 https://www.luogu.org/problemnew/show/CF336C 分析 一个比较妙的贪心 我们要让最后\(and\)起来的数被\(2^k\)整除且\(k\)最大,我们 ...