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

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 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操作符)**





参考自 慕课网

相关文章
|
1月前
|
缓存 Java 程序员
Map - LinkedHashSet&Map源码解析
Map - LinkedHashSet&Map源码解析
67 0
|
1月前
|
算法 Java 容器
Map - HashSet & HashMap 源码解析
Map - HashSet & HashMap 源码解析
52 0
|
24天前
|
存储 Java API
详细解析HashMap、TreeMap、LinkedHashMap等实现类,帮助您更好地理解和应用Java Map。
【10月更文挑战第19天】深入剖析Java Map:不仅是高效存储键值对的数据结构,更是展现设计艺术的典范。本文从基本概念、设计艺术和使用技巧三个方面,详细解析HashMap、TreeMap、LinkedHashMap等实现类,帮助您更好地理解和应用Java Map。
41 3
|
2月前
|
设计模式 Java 关系型数据库
【Java笔记+踩坑汇总】Java基础+JavaWeb+SSM+SpringBoot+SpringCloud+瑞吉外卖/谷粒商城/学成在线+设计模式+面试题汇总+性能调优/架构设计+源码解析
本文是“Java学习路线”专栏的导航文章,目标是为Java初学者和初中高级工程师提供一套完整的Java学习路线。
410 37
|
1月前
|
算法 Java 程序员
Map - TreeSet & TreeMap 源码解析
Map - TreeSet & TreeMap 源码解析
33 0
http数据包抓包解析课程笔记
http数据包抓包解析课程笔记
|
3月前
|
JSON 开发框架 JavaScript
【Azure Developer】使用.Net Core解析JSON的笔记
【Azure Developer】使用.Net Core解析JSON的笔记
|
3月前
|
开发者 API 开发框架
Xamarin 在教育应用开发中的应用:从课程笔记到互动测验,全面解析使用Xamarin.Forms构建多功能教育平台的技术细节与实战示例
【8月更文挑战第31天】Xamarin 作为一款强大的跨平台移动开发框架,在教育应用开发中展现了巨大潜力。它允许开发者使用单一的 C# 代码库构建 iOS、Android 和 Windows 应用,确保不同设备上的一致体验。Xamarin 提供广泛的 API 支持,便于访问摄像头、GPS 等原生功能。本文通过一个简单的教育应用示例——课程笔记和测验功能,展示了 Xamarin 在实际开发中的应用过程。从定义用户界面到实现保存笔记和检查答案的逻辑,Xamarin 展现了其在教育应用开发中的高效性和灵活性。
42 0
|
3月前
|
安全 Java API
Java 8 流库的魔法革命:Filter、Map、FlatMap 和 Optional 如何颠覆编程世界!
【8月更文挑战第29天】Java 8 的 Stream API 通过 Filter、Map、FlatMap 和 Optional 等操作,提供了高效、简洁的数据集合处理方式。Filter 用于筛选符合条件的元素;Map 对元素进行转换;FlatMap 将多个流扁平化合并;Optional 安全处理空值。这些操作结合使用,能够显著提升代码的可读性和简洁性,使数据处理更为高效和便捷。
124 0
|
4天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
16 2

推荐镜像

更多