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 :)

0 0
原创粉丝点击