对于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. mysqlslap 性能测试

    --create-schema=name 指定测试的数据库名,默认是mysqlslap --engine=name 创建测试表所使用的存储引擎,可指定多个 --concurrency=N 模拟N个客户 ...

  2. 集群架构03·MySQL初识,mysql8.0环境安装,mysql多实例

    官方网址 https://dev.mysql.com/downloads/mysql/社区版本分析 MySQL5.5:默认存储引擎改为InnoDB,提高性能和可扩展性,增加半同步复制 MySQL5.6 ...

  3. IJG JPEG使用说明

    IJG JPEG库使用说明 版权所有:1994-1998,Thomas G. Lane 本文档是IJG软件的一部分. 分发和使用的条件请参看README文档. 本文档讲述如何在应用程序中使用IJG(I ...

  4. sysconf获取系统参数

    头文件: #include <unistd.h> 原型:long sysconf(int sysnum); 示例: #include <stdio.h> #include &l ...

  5. Android Stadio导入Android工程项目,只有Edit Configurations的解决办法

    这几天导入老的Android工程项目,导入后,也不发红也不报错,但是Run这一项没有可运行的App,就只有一个Edit Configurations.经过查询后,发现运行一下Sync Project ...

  6. 关于spring 事务 和 AOP 管理事务和打印日志问题

    关于spring 事务 和 AOP 管理事务和打印日志问题 1. 就是支持事务注解的(@Transactional) . ​ 可以在server层总使用@Transactional,进行方法内的事务管 ...

  7. nginx访问量统计 日常分析

    nginx访问量统计 0.查询某个时间段的日志 cat appapi.dayutang.cn.access.log |grep 'POST'|grep '2019:10' > 20191059. ...

  8. fiddler笔记:Find Session窗口

    通过Edit菜单选项或CTRL+F打开Find Session窗口.其主要是用来搜索捕捉到的请求和响应. find 指定要搜索的文本 Options Search 支持的搜索选项:Requests a ...

  9. idea 编辑器Git暂存区的使用

    平时在开发时候 一般线上环境和线下环境区别会很大,所以一下线下的自己测试环境的代码没有如果提交会影响线上环境,所以一般都会使用git的一个暂存区作为临时存放不需要提交的代码,这样每次提交代码都可以在不 ...

  10. JavaScript数组方法之reduce

    又见到数组方法了,在前面已经的多次写到过数组方法,甚至都使用原生方法重构了一遍数组的各个方法,可是随着数组方法reduce的应用,发现reduce真的是妙用无穷啊!还是很值得再拿出来说一遍的. 我们再 ...