RXJava学习笔记(2)
来源:互联网 发布:哪个象棋软件好 编辑:程序博客网 时间:2024/05/18 19:21
变换操作
通过上篇的学习,我们知道了如何去创建一个Observable对象,通过subscribe将事件传递给Observer,但是仅仅知道这些是不够的,有些复杂的场景,需要我们对Observable进行一些转换来发射数据。那么我们就在这篇文章里来系统的学习一下吧
- Buffer操作符
Observable.from(email).buffer(3).subscribe(new Action1<List<String>>() {@Overridepublic void call(List<String> strings) { for (int i=0;i<strings.size();i++) { Log.d("SampleTransformingActiv", "strings:" + strings.get(i)); } Log.d("SampleTransformingActiv", "==========================");}});
运行结果
com.renyu.rxdemo D/SampleTransformingActiv: strings:email1com.renyu.rxdemo D/SampleTransformingActiv: strings:email2com.renyu.rxdemo D/SampleTransformingActiv: strings:email3com.renyu.rxdemo D/SampleTransformingActiv: ==========================com.renyu.rxdemo D/SampleTransformingActiv: strings:email4com.renyu.rxdemo D/SampleTransformingActiv: strings:email5com.renyu.rxdemo D/SampleTransformingActiv: strings:email6com.renyu.rxdemo D/SampleTransformingActiv: ==========================com.renyu.rxdemo D/SampleTransformingActiv: strings:email7com.renyu.rxdemo D/SampleTransformingActiv: strings:email8com.renyu.rxdemo D/SampleTransformingActiv: strings:email9com.renyu.rxdemo D/SampleTransformingActiv: ==========================com.renyu.rxdemo D/SampleTransformingActiv: strings:email10com.renyu.rxdemo D/SampleTransformingActiv: ==========================
buffer就是将数据按照规定的数量做一个缓存,达到这个数量之后再一次性全部发射出去
,在本例中,就是每缓存3个之后再发射出去
再看下2个参数的方法
Observable.from(email).buffer(3, 5).subscribe(new Action1<List<String>>() { @Override public void call(List<String> strings) { for (int i=0;i<strings.size();i++) { Log.d("SampleTransformingActiv", "strings:" + strings.get(i)); } Log.d("SampleTransformingActiv", "==========="); }});
运行结果
com.renyu.rxdemo D/SampleTransformingActiv: strings:email1com.renyu.rxdemo D/SampleTransformingActiv: strings:email2com.renyu.rxdemo D/SampleTransformingActiv: strings:email3com.renyu.rxdemo D/SampleTransformingActiv: ===========com.renyu.rxdemo D/SampleTransformingActiv: strings:email6com.renyu.rxdemo D/SampleTransformingActiv: strings:email7com.renyu.rxdemo D/SampleTransformingActiv: strings:email8com.renyu.rxdemo D/SampleTransformingActiv: ===========
buffer(count, skip),代表每发射skip个数据用count数据作为缓存,再进行发射,如果count==skip,就是第一种情况了
buffer不仅在数量上可以缓存,时间上也同样可以控制缓存
subscription=Observable.create(new Observable.OnSubscribe<String>() { @Override public void call(Subscriber<? super String> subscriber) { if (!subscriber.isUnsubscribed()) { for (int i=0;i<email.length;i++) { subscriber.onNext(email[i]); try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } } } }}).subscribeOn(Schedulers.newThread()).buffer(2, TimeUnit.SECONDS).subscribe(new Action1<List<String>>() { @Override public void call(List<String> strings) { for (int i=0;i<strings.size();i++) { Log.d("SampleTransformingActiv", "strings:" + strings.get(i)); } Log.d("SampleTransformingActiv", "==========="); }});
运行结果
02-15 17:15:22.935 14127-14156/com.renyu.rxdemo D/SampleTransformingActiv: strings:email102-15 17:15:22.935 14127-14156/com.renyu.rxdemo D/SampleTransformingActiv: strings:email202-15 17:15:22.935 14127-14156/com.renyu.rxdemo D/SampleTransformingActiv: strings:email302-15 17:15:22.935 14127-14156/com.renyu.rxdemo D/SampleTransformingActiv: strings:email402-15 17:15:22.945 14127-14156/com.renyu.rxdemo D/SampleTransformingActiv: ===========02-15 17:15:24.925 14127-14156/com.renyu.rxdemo D/SampleTransformingActiv: strings:email502-15 17:15:24.925 14127-14156/com.renyu.rxdemo D/SampleTransformingActiv: strings:email602-15 17:15:24.925 14127-14156/com.renyu.rxdemo D/SampleTransformingActiv: strings:email702-15 17:15:24.925 14127-14156/com.renyu.rxdemo D/SampleTransformingActiv: strings:email802-15 17:15:24.935 14127-14156/com.renyu.rxdemo D/SampleTransformingActiv: ===========02-15 17:15:26.925 14127-14156/com.renyu.rxdemo D/SampleTransformingActiv: strings:email902-15 17:15:26.925 14127-14156/com.renyu.rxdemo D/SampleTransformingActiv: strings:email1002-15 17:15:26.925 14127-14156/com.renyu.rxdemo D/SampleTransformingActiv: ===========02-15 17:15:28.925 14127-14156/com.renyu.rxdemo D/SampleTransformingActiv: ===========02-15 17:15:30.925 14127-14156/com.renyu.rxdemo D/SampleTransformingActiv: ===========02-15 17:15:32.925 14127-14156/com.renyu.rxdemo D/SampleTransformingActiv: ===========
注意观察时间,这边就是每2秒去执行一次操作
- FlatMap操作符
Observable.just("1", "2", "3", "4", "5", "6").flatMap(new Func1<String, Observable<String>>() { @Override public Observable<String> call(String s) { return Observable.just(s+"2"); }}).subscribe(new Action1<String>() { @Override public void call(String s) { Log.d("SampleTransformingActiv", s); }});
运行结果
com.renyu.rxdemo D/SampleTransformingActiv: 12com.renyu.rxdemo D/SampleTransformingActiv: 22com.renyu.rxdemo D/SampleTransformingActiv: 32com.renyu.rxdemo D/SampleTransformingActiv: 42com.renyu.rxdemo D/SampleTransformingActiv: 52com.renyu.rxdemo D/SampleTransformingActiv: 62
flatMap就是根据你的规则,将Observable转换之后再发射出去,注意最后的顺序很可能是错乱的,如果要保证顺序的一致性,要使用concatMap
- SwitchMap操作符
Observable.just(10, 20, 30).switchMap(new Func1<Integer, Observable<Integer>>() { @Override public Observable<Integer> call(Integer integer) { //10的延迟执行时间为1000毫秒、20和30的延迟执行时间为50毫秒 int delay = 1000; if (integer>10) { delay=50; } return Observable.just(integer).delay(delay, TimeUnit.MILLISECONDS); }}).subscribe(new Action1<Integer>() { @Override public void call(Integer integer) { Log.d("SampleTransformingActiv", "integer:" + integer); }});
运行结果
com.renyu.rxdemo D/SampleTransformingActiv: integer:30
switchmap的功能与flatMap应该说是类似,都是转换Observable,但是区别在于switchmap在产生新的Observable的同时,会摒弃旧的Observable
,所以本例并不像之前flatmap一样会产生3个结果,而是直接最后一个Observable替代了之前2个
- groupBy操作符
Observable.just("1", "2", "3", "4", "5", "6").groupBy(new Func1<String, Boolean>() { @Override public Boolean call(String s) { return Integer.parseInt(s)>3; }}).subscribe(new Action1<GroupedObservable<Boolean, String>>() { @Override public void call(final GroupedObservable<Boolean, String> booleanStringGroupedObservable) { booleanStringGroupedObservable.subscribe(new Action1<String>() { @Override public void call(String s) { Log.d("SampleTransformingActiv", booleanStringGroupedObservable.getKey() + " " + s); } }); }});
运行结果
com.renyu.rxdemo D/SampleTransformingActiv: false 1com.renyu.rxdemo D/SampleTransformingActiv: false 2com.renyu.rxdemo D/SampleTransformingActiv: false 3com.renyu.rxdemo D/SampleTransformingActiv: true 4com.renyu.rxdemo D/SampleTransformingActiv: true 5com.renyu.rxdemo D/SampleTransformingActiv: true 6
groupBy是通过key建立规则,通过这个规则进行分组发射
- Map操作符
Observable.just("1", "2", "3", "4", "5", "6").map(new Func1<String, Integer>() { @Override public Integer call(String s) { return Integer.parseInt(s); }}).subscribe(new Action1<Integer>() { @Override public void call(Integer integer) { Log.d("SampleTransformingActiv", "integer:" + integer); }});
运行结果
com.renyu.rxdemo D/SampleTransformingActiv: integer:1com.renyu.rxdemo D/SampleTransformingActiv: integer:2com.renyu.rxdemo D/SampleTransformingActiv: integer:3com.renyu.rxdemo D/SampleTransformingActiv: integer:4com.renyu.rxdemo D/SampleTransformingActiv: integer:5com.renyu.rxdemo D/SampleTransformingActiv: integer:6
map与flatmap在功能上是一致的,区别在于flatmap是通过中间Observable来进行,而map是直接执行
- Cast操作符
Observable.just("1", "2", "3", "4", "5", "6").cast(String.class).subscribe(new Action1<String>() { @Override public void call(String integer) { Log.d("SampleTransformingActiv", "integer:" + integer); }});
运行结果
com.renyu.rxdemo D/SampleTransformingActiv: integer:1com.renyu.rxdemo D/SampleTransformingActiv: integer:2com.renyu.rxdemo D/SampleTransformingActiv: integer:3com.renyu.rxdemo D/SampleTransformingActiv: integer:4com.renyu.rxdemo D/SampleTransformingActiv: integer:5com.renyu.rxdemo D/SampleTransformingActiv: integer:6
cast用于直接强制转换
- Scan
Observable.just(1, 2, 3, 4, 5, 6).scan(new Func2<Integer, Integer, Integer>() { @Override public Integer call(Integer integer, Integer integer2) { return integer+integer2; }}).subscribe(new Action1<Integer>() { @Override public void call(Integer integer) { Log.d("SampleTransformingActiv", "integer:" + integer); }});
运行结果
com.renyu.rxdemo D/SampleTransformingActiv: integer:1com.renyu.rxdemo D/SampleTransformingActiv: integer:3com.renyu.rxdemo D/SampleTransformingActiv: integer:6com.renyu.rxdemo D/SampleTransformingActiv: integer:10com.renyu.rxdemo D/SampleTransformingActiv: integer:15com.renyu.rxdemo D/SampleTransformingActiv: integer:21
scan类似递归操作,将这个函数的结果作为下一个数据的第一个参数,每次计算结果都会把结果给订阅者
- Window
window的作用与Buffer雷同,只不过他是返回一个Observable,而Buffer返回是一个list
,这里就不再多说了
主要参考文章
- 给 Android 开发者的 RxJava 详解 扔物线大神的文章,我的RXJava启蒙文章
- 木水川的博客 对RXJava操作符做了很详细的说明以及提供详细的示例
- ReactiveX文档中文翻译 mcxiaoke翻译的RXJava中文文档
- Android RxJava使用介绍 job_hesc对RXJava操作符介绍以及简单的示例
- RXJava学习笔记(2)
- RxJava学习笔记2
- RXJava学习笔记(1)
- RXJava学习笔记(3)
- RxJava 学习笔记(一)
- RxJava 学习笔记(二)
- RxJava 学习笔记(三)
- RxJava 学习笔记(四)
- RxJava学习笔记(一)
- RxJava学习笔记(一)
- RxJava学习笔记(一)--- 基础篇
- RxJava学习笔记(二)--- 操作符
- RxJava学习笔记(一)概念
- RxJava学习笔记(二)操作符
- RxJava学习笔记之初识(一)
- Retrofit+RxJava学习笔记(1)
- RxJava学习笔记
- RxJava学习笔记
- 20160126.CCPP体系详解(0005天)
- 用c语言代码编写的游戏“简易五子棋”
- Java基础04 封装与接口
- 编程题#3:计算数列平方和(C++程序设计第10周)
- C语言的流程控制
- RXJava学习笔记(2)
- 20160127.CCPP体系详解(0006天)
- linux常用命令
- 华为机试题:字符转换Univesity
- Java基础05 实施接口
- 20160128.CCPP体系详解(0007天)
- 2 Types of Linux File Locking (Advisory, Mandatory Lock Examples)
- C++查找数组中的最大值和最小值
- C语言函数