Android函数响应式编程——必学的RxJava变换操作符map、flatMap、cast、concatMap、flatMapIterable、buffer、groupBy
来源:互联网 发布:韩国实力知乎 编辑:程序博客网 时间:2024/06/16 10:25
gradle
// RxJava compile 'io.reactivex:rxjava:1.2.0' compile 'io.reactivex:rxandroid:1.2.1'
变换操作符:对被观察者(Oberserver)要发射的数据进行修改,修改后再发送出去。
1.map:把你原来观察者的数据进行修改(Retrofit就是采用的这个方式,把根地址和子地址拼接)
先创建一个正常的Observable
rx.Observable observable = rx.Observable.just("qq/lol");
再写一个func:意思就是对Observable要发送的数据进行修改
final String baseUrl = "http://www.baidu.com/";
Func1<String, String> func1 = new Func1<String, String>() { @Override public String call(String s) { return baseUrl + s; }};
修改操作:返回一个新的Obervable(因为这个方法的内部机制是重新创建了一个Observable)
rx.Observable newObservable = observable.map(func1);
观察者和订阅:(你不能订阅那个老的Observable)
Action1<String> onNextAction = new Action1<String>() { @Override public void call(String s) { Log.i("xbh", s); }};newObservable.subscribe(onNextAction);
输出结果:
12-09 03:51:14.906 23341-23341/? I/xbh: http://www.baidu.com/qq/lol
2.flatMap、cast:和上面的有所区别,这次是把给多个子url添加一个baseUrl。
被观察者
rx.Observable observable = rx.Observable.just("qq/chiji", "qq/feiche", "qq/xuanwu", "qq/55kai");
func:
final String baseUrl = "http://www.baidu.com/";
Func1<String, rx.Observable<?>> func1 = new Func1<String, rx.Observable<?>>() { @Override public rx.Observable<?> call(String s) { return rx.Observable.just(baseUrl + s); }};第二个方法可能难以理解:因为现在的数据是4个,那么实际上这个call方法是执行了4次(后来我打印了日志确认就是这样)。所以s代表的是这4个不同的数据。
修改操作:
rx.Observable newObservable = observable.flatMap(func1).cast(String.class);
输出日志:
12-09 04:17:43.811 15188-15188/com.hdu.a15058124.homework3 I/xbh: http://www.baidu.com/qq/chiji
12-09 04:17:43.811 15188-15188/com.hdu.a15058124.homework3 I/xbh: http://www.baidu.com/qq/feiche
12-09 04:17:43.811 15188-15188/com.hdu.a15058124.homework3 I/xbh: http://www.baidu.com/qq/xuanwu
12-09 04:17:43.811 15188-15188/com.hdu.a15058124.homework3 I/xbh: http://www.baidu.com/qq/55kai
3.concatMap:上面那个方法的输出可能会不是按照我们刚刚的顺序来,这个方法可以确保顺序正确。
使用:只需要把上述flatMap换成concatMap即可
4.flatMapIterable:和上面的大致相仿,只是有些地方需要修改一下。
func
Func1<String, Iterable<String>> func1 = new Func1<String, Iterable<String>>() { @Override public Iterable<String> call(String s) { List<String> list = new ArrayList<>(); list.add(baseUrl + s); return list; }};
修改:
rx.Observable newObservable = observable.flatMapIterable(func1).cast(String.class);
5.buffer:比如给定123456 buffer(2)就是让他们每两个成为1组,把每两个数处理成一个List<Integer>
被观察者:
rx.Observable observable = rx.Observable.just(1,2,3,4,5,6);
修改:现在可以看做rx.Observable<List<Integer>> newObservable = rx.Observable.just(list1,list2,list3);list1放的是12,list2放的是34,list3放的是56
rx.Observable<List<Integer>> newObservable = observable.buffer(2);
观察者:
Action1<List<Integer>> onNextAction = new Action1<List<Integer>>() { @Override public void call(List<Integer> list) { for (Integer i : list) { Log.i("xbh", i + ""); } Log.i("xbh", " "); }};
订阅:
newObservable.subscribe(onNextAction);
输出日志:
12-09 04:50:34.015 12938-12938/? I/xbh: 1
12-09 04:50:34.015 12938-12938/? I/xbh: 2
12-09 04:50:34.015 12938-12938/? I/xbh:
12-09 04:50:34.015 12938-12938/? I/xbh: 3
12-09 04:50:34.015 12938-12938/? I/xbh: 4
12-09 04:50:34.015 12938-12938/? I/xbh:
12-09 04:50:34.015 12938-12938/? I/xbh: 5
12-09 04:50:34.015 12938-12938/? I/xbh: 6
12-09 04:50:34.015 12938-12938/? I/xbh:
6.groupBy
简单来说。
比如:
Book b1 = new Book("Android群英传之神兵利器","A");Book b2 = new Book("Android进阶之光","SSS");Book b3 = new Book("Android高级进阶","SS");Book b4 = new Book("Android群英传","A");Book b5 = new Book("源码","SSSS");Book b6 = new Book("第一行代码(第二版)","SS");
你给他一个标准,比如,按后面的英文字母排序,就会这样输出:
12-09 05:23:02.993 10082-10082/com.hdu.a15058124.homework3 I/xbh: 书名:Android群英传之神兵利器 书的质量:A12-09 05:23:02.993 10082-10082/com.hdu.a15058124.homework3 I/xbh: 书名:Android群英传 书的质量:A
12-09 05:23:02.994 10082-10082/com.hdu.a15058124.homework3 I/xbh: 书名:Android进阶之光 书的质量:SSS
12-09 05:23:02.994 10082-10082/com.hdu.a15058124.homework3 I/xbh: 书名:Android高级进阶 书的质量:SS
12-09 05:23:02.994 10082-10082/com.hdu.a15058124.homework3 I/xbh: 书名:第一行代码(第二版) 书的质量:SS
12-09 05:23:02.994 10082-10082/com.hdu.a15058124.homework3 I/xbh: 书名:源码 书的质量:SSSS
被观察者
rx.Observable observable = rx.Observable.just(b1,b2,b3,b4,b5,b6);
func:也是排序的标准
Func1<Book,String> func1 = new Func1<Book, String>() { @Override public String call(Book book) { return book.getBookQuality(); }};
排序规则:
rx.Observable<GroupedObservable<String, Book>> GroupedObservable = observable.groupBy(func1);
根据排序规则返回的新的被观察者:
rx.Observable<Book> newObservable = rx.Observable.concat(GroupedObservable);
观察者
Action1<Book> onNextAction = new Action1<Book>() { @Override public void call(Book book) { Log.i("xbh", "书名:" + book.getBookName() + " 书的质量:" + book.getBookQuality()); }};
订阅
newObservable.subscribe(onNextAction);
- Android函数响应式编程——必学的RxJava变换操作符map、flatMap、cast、concatMap、flatMapIterable、buffer、groupBy
- RxJava变换操作符:.concatMap( )与.flatMap( )的比较
- RxJava变换操作符:.concatMap( )与.flatMap( )的比较
- Android函数响应式编程——必学的RxJava创建操作符create、just、from、interval、range、repeat
- Android函数响应式编程——必学的RxJava组合操作符startWith、merge、concat、zip、combineLastest
- Android函数响应式编程——必学的RxJava辅助操作符delay、Do、subscribeOn、observeOn、timeout
- Android函数响应式编程——必学的RxJava错误处理操作符catch、retry
- Android函数响应式编程——必学的RxJava转换操作符toList、toSortedList、toMap
- 7.2 Transforming 变换操作 - Buffer/Window/Map/FlatMap/GroupBy/Scan
- RxJava变换操作符:.concatMap( )与.flatMap( )的比较(即有序对无序)
- Android函数响应式编程——必学的RxJava条件操作符和布尔操作符all、contains、isEmpty、amb、defaultIfEmpty
- Android函数响应式编程——必学的RxJava过滤操作符filter、elementAt、distinct、skip、take、ignoreElements、throttleFirst
- RxJava的学习之变换操作符—flatMap
- RxJava的学习之变换操作符—buffer
- RxJava concatMap操作符
- RxJava concatMap操作符
- RX操作符之对Observable发射的数据执行变换操作一(map、cast、flatmap、flatmapiteriable、switchmap)
- 操作符之concatMap( )与.flatMap( )的比较
- ubuntu 16.04安装mysql-server_5.7.xx
- 飞跃原野sdut1124
- 剑指offer 求1+2+3+..+n
- Struts2中<s:iterator>基本用法及示例
- 使用java打开本地文件的方法
- Android函数响应式编程——必学的RxJava变换操作符map、flatMap、cast、concatMap、flatMapIterable、buffer、groupBy
- 组合查询(Union)
- 问题记录4 错误 LNK2019
- OC和Swift互相跳转
- LeetCode练习记录2017/12/9
- IOS地理位置及定位系统MapKit开发推荐
- SDFormat
- 设计模式学习之单例模式
- gazebo