对于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. 最新 小米java校招面经 (含整理过的面试题大全)

    从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿.小米等10家互联网公司的校招Offer,因为某些自身原因最终选择了小米.6.7月主要是做系统复习.项目复盘.LeetCode ...

  2. .net 结合FFMPEG

    读取流 https://blog.csdn.net/vanjoge/article/details/79657874 基于设备,推流 https://blog.csdn.net/lxbwolf/art ...

  3. 日常工作问题解决:centos/linux系统如何检测端口是否打开

    1.telnet命令 格式: telnet ip 端口号 [root@centos7-127 ~]# telnet 192.168.87.128 22 Trying 192.168.87.128... ...

  4. NameNode 和 SecondaryNameNode

    1. NN 和 2NN 工作机制 NameNode 会产生在磁盘中备份元数据的FsImage; 每当元数据有更新或者添加数据时,修改内存中的元数据并追加到Edits中; SecondaryNameNo ...

  5. [LuoguP2167][SDOI2009]Bill的挑战_容斥原理/状压dp

    Bill的挑战 题目链接:https://www.luogu.org/problem/P2167 数据范围:略. 题解: 因为$k$特别小,想到状压. 状压的方式也非常简单,就是暴力枚举. 但是会不会 ...

  6. 【1.0】shell常用信息

    [1]获取IP地址 /sbin/ifconfig|grep -A1 -E "^eth0|em2"|grep "inet addr"|awk -F':' '{pr ...

  7. c# dateTime格式转换为Unix时间戳工具类

    using System; using System.Collections.Generic; using System.Text; namespace TJCFinanceWriteOff.BizL ...

  8. C++版 归并排序

    在原作者基础上加入注释 原作者:https://www.cnblogs.com/agui521/p/6918229.html 归并排序:归并排序(英语:Merge sort,或mergesort),是 ...

  9. ubuntu 拨号上网

    如果没有安装的用户,可以使用 sudo apt-get install pppoe pppoeconf 然后配置上网 sudo pppoeconf 最后,使用 sudo pon dsl-provide ...

  10. react的状态管理

    近两年前端技术的发展如火如荼,大量的前端项目都在使用或转向 Vue 和 React 的阵营, 由前端渲染页面的单页应用占比也越来越高,这就代表前端工作的复杂度也在直线上升,前端页面上展示的信息越来越多 ...