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

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

操作符

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

  • **变换:

核心功能;
就是将事件序列中的(事件)对象整个序列进行加工处理
转换成不同事件或者事件序列;**

  • map操作符:就是用来把一个事件转换为另一个事件的;

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

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中的一个接口
它用于包装含有参数的方法

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作用类似;

都是用于进行事件转换的;

下面是示例代码:

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激活
让它自己开始发送事件

  1. 每一个创建出来的Observable发送的事件

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





参考自 慕课网

相关文章
|
8月前
|
编译器 C++ 容器
【c++丨STL】基于红黑树模拟实现set和map(附源码)
本文基于红黑树的实现,模拟了STL中的`set`和`map`容器。通过封装同一棵红黑树并进行适配修改,实现了两种容器的功能。主要步骤包括:1) 修改红黑树节点结构以支持不同数据类型;2) 使用仿函数适配键值比较逻辑;3) 实现双向迭代器支持遍历操作;4) 封装`insert`、`find`等接口,并为`map`实现`operator[]`。最终,通过测试代码验证了功能的正确性。此实现减少了代码冗余,展示了模板与仿函数的强大灵活性。
212 2
|
8月前
|
算法 测试技术 C语言
深入理解HTTP/2:nghttp2库源码解析及客户端实现示例
通过解析nghttp2库的源码和实现一个简单的HTTP/2客户端示例,本文详细介绍了HTTP/2的关键特性和nghttp2的核心实现。了解这些内容可以帮助开发者更好地理解HTTP/2协议,提高Web应用的性能和用户体验。对于实际开发中的应用,可以根据需要进一步优化和扩展代码,以满足具体需求。
769 29
|
8月前
|
前端开发 数据安全/隐私保护 CDN
二次元聚合短视频解析去水印系统源码
二次元聚合短视频解析去水印系统源码
249 4
|
8月前
|
JavaScript 算法 前端开发
JS数组操作方法全景图,全网最全构建完整知识网络!js数组操作方法全集(实现筛选转换、随机排序洗牌算法、复杂数据处理统计等情景详解,附大量源码和易错点解析)
这些方法提供了对数组的全面操作,包括搜索、遍历、转换和聚合等。通过分为原地操作方法、非原地操作方法和其他方法便于您理解和记忆,并熟悉他们各自的使用方法与使用范围。详细的案例与进阶使用,方便您理解数组操作的底层原理。链式调用的几个案例,让您玩转数组操作。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
8月前
|
移动开发 前端开发 JavaScript
从入门到精通:H5游戏源码开发技术全解析与未来趋势洞察
H5游戏凭借其跨平台、易传播和开发成本低的优势,近年来发展迅猛。接下来,让我们深入了解 H5 游戏源码开发的技术教程以及未来的发展趋势。
|
8月前
|
存储 前端开发 JavaScript
在线教育网课系统源码开发指南:功能设计与技术实现深度解析
在线教育网课系统是近年来发展迅猛的教育形式的核心载体,具备用户管理、课程管理、教学互动、学习评估等功能。本文从功能和技术两方面解析其源码开发,涵盖前端(HTML5、CSS3、JavaScript等)、后端(Java、Python等)、流媒体及云计算技术,并强调安全性、稳定性和用户体验的重要性。
|
7月前
|
JavaScript 前端开发 开发者
flat、flatmap与map的用法区别
本文介绍了 JavaScript 数组方法 `flat()`、`flatMap()` 和 `map()` 的用法及区别。`flat()` 可按指定深度递归展平数组,参数为深度,默认一层;`flatMap()` 结合了 `map()` 和 `flat()` 功能,返回一维数组,长度可能不同于原数组;而 `map()` 返回与原数组长度一致的新数组。通过多个代码示例展示了三者的功能和差异,帮助开发者更好地理解和使用这些方法。
734 0
|
8月前
|
负载均衡 JavaScript 前端开发
分片上传技术全解析:原理、优势与应用(含简单实现源码)
分片上传通过将大文件分割成多个小的片段或块,然后并行或顺序地上传这些片段,从而提高上传效率和可靠性,特别适用于大文件的上传场景,尤其是在网络环境不佳时,分片上传能有效提高上传体验。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
5月前
|
安全 Java 数据库连接
让我们讲解一下 Map 集合遍历的方式
我是小假 期待与你的下一次相遇 ~
189 43
使用 entrySet 遍历 Map 类集合 KV
使用 entrySet 遍历 Map 类集合 KV

推荐镜像

更多
  • DNS