RxJava1.x从入门到放弃再到RxJava 2.x(三)
来源:互联网 发布:标书软件破解版 编辑:程序博客网 时间:2024/05/16 10:17
概述
RxJava提供了对事件顺序进行变换的支持,这是它的核心功能之一。本节主要学习map()和flatMap()这两个操作符。
map()
map操作符接受一个Function类型的参数就像这样map(Function<T, R>)
,然后把这个Function应用到每一个由Observable发射的值上,将发射的值转换成我们希望的值。这种抽象的定义我相信你也听不懂,我们来看一下官方给出的原理图:
这原理图直观的表达了上游水管的圆形事件经过map转换后,把圆形事件变成菱形的事件,再流向下游水管。
假设我们需要将一组数字转换成字符串,我们可以通过map这样实现:
Observable.just(-1024,1025) .map(new Function<Integer, String>() { @Override public String apply(Integer integer) throws Exception { return "原始数据的绝对值: " + Math.abs(integer); } }).subscribe(new Consumer<String>() { @Override public void accept(String s) throws Exception { Log.e(TAG, s); } });
Function构造函数中的两个参数分别是Observable发射值当前的类型和map转换后的类型,上面的例子中发射的当前的类型是Integer,转换后的类型是String。
flatMap
flatMap()函数同样也是做转换的,但作用不一样。FlatMap将一个发送事件的上游Observable变换为多个发送事件的Observables,然后将它们发射的事件合并后放进一个单独的Observable里。先一起看下官方给的原理图:
咳咳,一起解读下这图传递的信息:上游水管发送了3个圆形的事件,经过flatMap转化,把一个圆形事件变成两个菱形的事件,最后流向下游水管。但是,注意看下游水管中的事件,说明flatMap不保证事件的顺序。
假设这样一个场景:我们有一组小区Community[] communities,需要打印出每个小区下面所有房子的价格。于是我可以这样实现:
List<House> datas=new ArrayList<>(); datas.add(new House("1001","400w")); datas.add(new House("2001","440w")); datas.add(new House("3001","500w")); Community community=new Community("香榭小区",datas); Observable.fromArray(community).flatMap(new Function<Community, ObservableSource<House>>() { @Override public ObservableSource<House> apply(Community community) throws Exception { return Observable.fromIterable(community.mHouseList); } }).subscribe(new Consumer<House>() { @Override public void accept(House house) throws Exception { Log.e(TAG,"house's price is :"+house.price); } });
打印:
05-07 13:30:25.549 24048-24048/com.example.dawn4get.rxdemo E/tag: house's price is :400w05-07 13:30:25.549 24048-24048/com.example.dawn4get.rxdemo E/tag: house's price is :440w05-07 13:30:25.549 24048-24048/com.example.dawn4get.rxdemo E/tag: house's price is :500w
从前面的例子中你肯定发现了,flatMap()和map()都是把传入的参数转化之后返回另一个对象。但和map()不同的是,flatMap()中返回的是Observable对象,并且这个Observable对象并不是被直接发送到Subsciber的回调方法中。
contactMap
concatMap()解决了flatMap()的交叉问题,它能够把发射的值连续在一起,就像这样:
map和flatMap在我看来就像孪生兄弟一样,非常实用,实际开发中也我也经常使用,个人觉得要想上手RxJava,掌握这两个操作符必不可少。ok,这节的学习就到这边吧,see u :)
- RxJava1.x从入门到放弃再到RxJava 2.x(三)
- RxJava1.x从入门到放弃再到RxJava 2.x(一)
- RxJava1.x从入门到放弃再到RxJava 2.x(二)
- RxJava1.x从入门到放弃再到RxJava 2.x(四)
- 从RxJava1.x到2.0
- RxJava 从入门到放弃再到不离不弃
- DOCKER 从入门到放弃(三)
- JavaScript从入门到放弃(三)
- Python 从入门到放弃(三)
- RxJava1.X升级到RxJava2.X笔记
- RxJava1.X升级到RxJava2.X笔记
- RxJava从入门到放弃---关于RxJava-入门必看
- RxJava从入门到放弃1.0--rxjava的简单使用
- Swift3.0从入门到放弃(三)
- Dagger2+MVP+RxJava+Retrofit从放弃到入门
- Hibernate从入门到放弃(三)----持久化对象
- Docker 从入门到放弃(三)之Docker环境
- SpringBoot-从入门到放弃(三) 配置文件简介
- java中异常和IO流的详解
- Android 蓝牙开发(七)hfp音频连接
- 键盘与文本事件
- ResponseEntity实现文件下载
- Maven中设置阿里云中央仓库
- RxJava1.x从入门到放弃再到RxJava 2.x(三)
- windows 字符集
- (三)6W2H方法
- pyrocko.org
- 自动化测试笔记
- HDU 6031(CCPC女生赛1009)
- 二六.vue2与vue1的区别(二)
- 【HDU6029】Graph Theory(贪心+队列)
- yum命令参考