对于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事件流变换者--操作符的更多相关文章

  1. RxJava【变换】操作符 map flatMap concatMap buffer MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  2. RxJava系列之二 变换类操作符具体解释1

    1.回想 上一篇文章我们主要介绍了RxJava , RxJava 的Observables和 RxJava的just操作符.以及RxJava一些经常使用的操作. 没看过的抓紧点我去看吧. 事实上RxJ ...

  3. js事件捕获,事件冒泡,事件委托以及DOM事件流

    一:DOM事件流: 事件流是从页面接收事件的顺序,DOM2级事件规定事件流包括三个阶段: ①事件捕获阶段:用意在于事件达到目标之前捕获它,在事件捕获阶段事件流模型:document→html→body ...

  4. 事件流处理框架NEsper for .NET z

    复合事件处理(Complex Event Processing)介绍提到了开源的Esper,NEsper 是一个事件流处理(Event Stream Processing,ESP)和复杂事件处理(Co ...

  5. HTML 事件(三) 事件流与事件委托

    本篇主要介绍HTML DOM中的事件流和事件委托. 其他事件文章 1. HTML 事件(一) 事件的介绍 2. HTML 事件(二) 事件的注册与注销 3. HTML 事件(三) 事件流与事件委托 4 ...

  6. 浅析JavaScript事件流——冒泡

    一.什么是事件冒泡流 我们知道事件流指的是从页面中接受事件的顺序. 为了形象理解事件冒泡,可以想象三军主将诸葛亮,在帐内运筹帷幄,眼观六路耳听八方,这时候前方的战事情况就需要靠传令兵来传达,当第一位传 ...

  7. js事件流

    event:事件对象,当一个事件发生的时候,和当前这个对象发生的这个事件有关的一些详细的信息都会被临时保存在一个指定地方-event对象,供我们在需要调用.event对象必须是在一个事件调用的函数里 ...

  8. javaScript事件(一)事件流

    一.事件 事件是用户或浏览器自身执行的某种动作,如click,load和mouseover都是事件的名字.事件是javaScript和DOM之间的桥梁.你若触发,我便执行——事件发生,调用它的处理函数 ...

  9. 理解DOM事件流的三个阶段

    本文主要解决两个问题: 1.什么是事件流 2.DOM事件流的三个阶段 事件流之事件冒泡与事件捕获 在浏览器发展的过程中,开发团队遇到了一个问题.那就是页面中的哪一部分拥有特定的事件? 可以想象画在一张 ...

随机推荐

  1. Windows系统Python直接调用C++ DLL

    环境:Window 10,VS 2019, Python 2.7.12, 64bit 1,打开 VS 2019,新建C++ Windows 动态链接库工程 Example,加入下列文件,如果Pytho ...

  2. MATLAB符号求解极限积分微分级数2

    一.符号表达式的极限 limit(F,x,a):求当时,符号表达式F的极限. limit(F,a):符号表达式F采用默认自变量(可由函数findsym求得),该函数求F的自变量趋于a时的极限值. li ...

  3. pacemaker入门

    原文链接:https://blog.csdn.net/a964921988/article/details/82628478 因为数据库部署在Linux上,需要做数据库集群实现高可用,而所有的Post ...

  4. Reactor系列(九)collect集合

    #java#reactor#collect#collectMap#collectList# 集合 视频讲解: https://www.bilibili.com/video/av79860614/ Fl ...

  5. oracle - for in loop 循环更新

    用法:目的更新B表的数据 查询出A表的字段,命名为表1.然后更新B表 BEGIN FOR 表1 IN ( SELECT [匹配字段],[更新字段] FROM A表 ) loop UPDATE B表 S ...

  6. Java各版本新特性总结

       Java或者说JDK的更新一般分为两部分内容:Java语言.JVM(C.C++编写),但通常情况下都不会单独发布,因为新的语言特性需要特定的JVM支持才行.下面我总结了从古至今Java各版本的新 ...

  7. 测试常用__linux命令

    1.显示目录和文件的命令 Ls:用于查看所有文件夹的命令. Dir:用于显示指定文件夹和目录的命令 Tree: 以树状图列出目录内容 Du:显示目录或文件大小 2.修改目录,文件权限和属主及数组命令 ...

  8. 20190804-Python基础 第二章 列表和元组

    容器,Python支持一种数据结构的基本概念(容器,基本上就是可包含其他对象的对象.) 两种主要的容器是:序列(如列表和元组)和映射(如字典) Ps: 列表与元组区别,列表可修改,元组不能. 对序列的 ...

  9. 怎样快捷获取元素节点body

    1. 使用: document.body document.body.nodeName; // "BODY" 2. 使用: document.getElementsByTagNam ...

  10. 怎样快捷获取网页的window对象

    使用document.defaultView; document.defaultView === window 注意: 1. 如果当前文档不属于window对象, 则返回null; 2. docume ...