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事件流的三个阶段 事件流之事件冒泡与事件捕获 在浏览器发展的过程中,开发团队遇到了一个问题.那就是页面中的哪一部分拥有特定的事件? 可以想象画在一张 ...
随机推荐
- QFramework 使用指南 2020 (一): 概述
大家好,我是 QFramework 的作者 凉鞋,QFramework 从第一次代码提交到现在快 5 年了,期间陆陆续续增加了很多功能,在使用体验上做了大量的改进. 而市面上关于 QFramework ...
- 攻防世界CRYPTO新手练习
0x01 base64 直接base64 Decode 得到flag cyberpeace{Welcome_to_new_World!} 0x02 Caesar key为12 的恺撒密码,解密德fla ...
- 最新 波克城市java校招面经 (含整理过的面试题大全)
从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿.波克城市等10家互联网公司的校招Offer,因为某些自身原因最终选择了波克城市.6.7月主要是做系统复习.项目复盘.Leet ...
- eNSP——配置Trunk接口
原理: 在以太网中,通过划分 VLAN 来隔离广播域和增强网络通信的安全性.以太网通常由多台交换机组成,为了使 VLAN 的数据帧跨越多台交换机传递,交换机之间互连的链路需要设置为干道链路( Trun ...
- 2019icpc-徐州网络赛
B. hxc写的 AC code: #pragma GCC optimize(2) #include <cstdio> #include <queue> #include &l ...
- FastJson 介绍
Json详解 Json是一种轻量级的数据交换格式,采用一种“键:值”对的文本格式来存储和表示数据,在系统交换数据过程中常常被使用,是一种理想的数据交换语言.在使用 Java 做 Web 开发时,不可避 ...
- [转]Life of a binary
发现一篇讲程序生命周期的文章,感觉蛮不错.
- 【调试经验】C++和C的混合编程以及库调用
问题背景 这两天在移植一个开源的库,偏底层的那种,所以对架构有一些依赖.源码的编译是通过Makefile来构建,怎奈公司的架构用的是CMAKE,所以就在开源的顶层和子目录分别构建了CMakeList, ...
- 初识机器学习——概念介绍(imooc笔记)
前言 imooc的机器学习一个最基本的介绍类课程,http://www.imooc.com/learn/717 ,不怎么涉及具体的算法或实现,只是讲了讲一些理论概念. 概述 机器学习: 利用计算机从历 ...
- Asp.net core 学习笔记 ef core Surrogate Key, Natural Key, Alternate Keys
更新: 2019-12-23 foreignkey 并不一样要配上 alternate key,其实只要是 unique 就可以了. 和 sql server 是一样的, 经常有一种错觉 primar ...