前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Rxjava源码解析笔记 | 剖析map、flatmap操作符的使用与联系

Rxjava源码解析笔记 | 剖析map、flatmap操作符的使用与联系

作者头像
凌川江雪
发布2019-06-11 14:13:06
8230
发布2019-06-11 14:13:06
举报
文章被收录于专栏:李蔚蓬的专栏

操作符

Rxjava提供了对事件序列进行变换的支持;

  • 变换: 核心功能; 就是将事件序列中的(事件)对象整个序列进行加工处理 转换成不同事件或者事件序列
  • map操作符:就是用来把一个事件转换为另一个事件的;

下面结合实例代码分析map操作符

代码语言:javascript
复制
package com.example.jiajiemu.a11.rxjava;

import android.graphics.Bitmap;
import android.util.Log;

import rx...

public class RxjavaOperatorDemo {
    private void map() {
        Observable.just("map/image/map.png")
                .map(new Func1<String, Bitmap>() {
                    @Override
                    public Bitmap call(String filePath) {
                        return getBitmap(filePath);
                    }
                })
                .subscribe(new Action1<Bitmap>() {
                    @Override
                    public void call(Bitmap bitmap) {
                        showBitmap(bitmap);
                    }
                });
    }

    private void showBitmap(Bitmap bitmap) {
        // TODO: 2017/10/7
    }

    private Bitmap getBitmap(String filePath) {
        return null;
    }

    private Subscription processNetAddress() {
        return Observable.just(
                "http://www.baidu.com/",
                "https://www.sina.com/",
                "https://www.sohu.com/")
                .flatMap(new Func1<String, Observable<String>>() {
                    @Override
                    public Observable<String> call(String s) {
                        return createObservable(s);
                    }
                })
                .subscribe(new Action1<String>() {
                    @Override
                    public void call(String s) {
                    }
                });
    }

    private Observable<String> createObservable(String s) {
        return null;
    }
}
  • Observable.just("map/image/map.png") 首先通过just()创建Observable(被观察者)参数String类型,即图片path
  • 接着通过链式调用map操作符进行相应的变换; 这里做的是String转到Bitmap的变换; 这里可见map中会传入一个Func1类(其参数是String、Bitmap两个), 注意Func1Rxjava中的一个接口, 它用于包装含有参数的方法
代码语言:javascript
复制
Observable.just("map/image/map.png")
.map(new Func1<String, Bitmap>() {
                    @Override
                    public Bitmap call(String filePath) {
                        return getBitmap(filePath);
                    }
                })
  • 这里注意Func1第一个参数——“String”, 就代表着Observable 当前发出的类型, 即示例中当前发出的类型 String, 正对应着just()方法中传入的 String类型 的 图片path
  • 而第二个参数Bitmap, 即String类型** 将要转换成的类型**;

小结: 通过just方法传入String类型(也就是图片Path) 然后调用map操作符 String类型图片Path 转换成Bitmap 这就完成了map操作符的调用 map操作符会创建一个新的Observable 再链式调用subscribe(), 完成订阅关系; 这也是用Observable来调用subscribe()而不是用Observer来调用的原因; Rxjava可以通过不同种类的操作符来完成新的Observable创建 进而进行链式调用

  • !!! map()函数接受一个Func1类型的参数, 然后把这个Func1应用到每一个由Observable发射的值上, 发射的值转换为我们期望的值 map()是Rxjava中操作符的最常见的一种使用;

flatMap操作符

  • flatMap其实和map作用类似; 都是用于进行事件转换的;

下面是示例代码:

代码语言:javascript
复制
private Subscription processNetAddress() {
        return Observable.just(
                "http://www.baidu.com/",
                "https://www.sina.com/",
                "https://www.sohu.com/")
                .flatMap(new Func1<String, Observable<String>>() {
                    @Override
                    public Observable<String> call(String s) {
                        return createObservable(s);
                    }
                })
                .subscribe(new Action1<String>() {
                    @Override
                    public void call(String s) {
                    }
                });
    }
  • 以上是一个简单的场景, 首先通过just()输入三个String类型url地址, 返回一个网站url列表
  • 调用just()完成Observable的创建之后, 就调用flatMap操作符; 就示例而言, mapflatMap区别在于, mapString转换成了Bitmap, 而flatMapString转换成了Observable; 当然它们的共同点是, 它们都是用来进行事件转换的; 以上区别是理解flatMap的关键, 因为, flatMap转换得到的Observable, 正是.subscribe()需要用到的, .subscribe()会接收到just()中的那一连串的字符串, 来完成输出;

flatmap的原理, 就是将String类型转换成Observable 然后给subscriber 观察者接收;

  1. 传入事件对象转换成一个Observable对象
  2. 这是不会直接发送这个Observable, 而是将这个Observable激活, 让它自己开始发送事件
  3. 每一个创建出来的Observable发送的事件, 都会被汇入同一个Observable

Rxjava官网上的一张图 map是会将事件一一对应 映射成一个新的事件 flatmap则会将所有的事件,转换成一个Observable 然后由这个统一的Observable来进行事件的分发 (这其实也符合其英文命名的意义 flatmap——扁平化的map操作符

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019.06.04 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 操作符
  • 下面结合实例代码分析map操作符
  • flatMap操作符
相关产品与服务
腾讯云代码分析
腾讯云代码分析(内部代号CodeDog)是集众多代码分析工具的云原生、分布式、高性能的代码综合分析跟踪管理平台,其主要功能是持续跟踪分析代码,观测项目代码质量,支撑团队传承代码文化。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档