Rxjava - map变换

Rxjava3 全新详解及常用操作符 RxJava 是一个基于 Java 的响应式编程库,用于处理异步事件流和数据流。它是由 Netflix 开发并开源,现在广泛用于 Android 和 Java 后端开发。RxJava 提供了一种用于组合和处理异步数据的丰富工具集,它的核心思想是将数据流视为一系列事件,以响应事件的方式进行处理。RxJava 提供了丰富的操作符,用于处理和转换数据流。这些操作符可以帮助你执行各种操作,包括过滤、映射、合并、变换等,以便更好地处理异步数据流。 阅读详情
Rxjava是一个异步框架,类似于AsyncTask,其优点在于让你的异步代码更简洁,阅读代码会更轻松。知己知彼,百战不殆。
我们从源码分析Rxjava原理,可以让我们更轻松的使用Rxjava,最主要还能学到Rxjava响应式编程的思想。

还是先来一个小例子:

Observable<String> observable = Observable.create(new Observable.OnSubscribe<String>() {
    @Override
    public void call(Subscriber<? super String> subscriber) {
        Log.e(getClass().getName(), "subscriber call begin");
        subscriber.onNext("value is 1");
        subscriber.onNext("value is 2");
        subscriber.onNext("value is 3");
        subscriber.onCompleted();
    }
});
Observable<Integer> mapObservable = observable.map(new Func1<String, Integer>() {
    @Override
    public Integer call(String s) {
        return Integer.parseInt(s.substring(s.length() - 1));
    }
});
Observer<Integer> observer = new Observer<Integer>() {
    @Override
    public void onCompleted() {
        Log.e(getClass().getName(), "observer is completed");
    }
    @Override
    public void onError(Throwable e) {
        Log.e(getClass().getName(), "observer is error");
    }
    @Override
    public void onNext(Integer s) {
        Log.e(getClass().getName(), "observer next value : " + s);
    }
};
mapObservable.subscribe(observer);

从代码可以看出,map方法的主要作用是:

Observable<T> ----------------> Observable<R>

我们看看Observable的map方法怎么做到的:

// Observable类
public final <R> Observable<R> map(Func1<? super T, ? extends R> func) {
    return unsafeCreate(new OnSubscribeMap<T, R>(this, func));
}
public static <T> Observable<T> unsafeCreate(OnSubscribe<T> f) {
    return new Observable<T>(RxJavaHooks.onCreate(f));
}

先创建一个OnSubscribeMap作为新的OnSubscribe(OnSubscribe2),返回新创建Observable(Observable2,也就是例子中的mapObservable ),当Observable与Observer发生订阅关系时,OnSubscribe2的call方法会被调用,所以我们看看OnSubscribeMap的call方法:

// OnSubscribeMap类
public final class OnSubscribeMap<T, R> implements OnSubscribe<R> {
    final Observable<T> source;
    final Func1<? super T, ? extends R> transformer;
    public OnSubscribeMap(Observable<T> source, Func1<? super T, ? extends R> transformer) {
        this.source = source;
        this.transformer = transformer;
    }
    @Override
    public void call(final Subscriber<? super R> o) {
        MapSubscriber<T, R> parent = new MapSubscriber<T, R>(o, transformer);
        o.add(parent);
        source.unsafeSubscribe(parent);
    }
}

先由以前的观察者/订阅者(也就是例子中的observer)生成一个新的观察者/订阅者(MapSubscriber),我们简单看一下MapSubscriber类:

// MapSubscriber类
static final class MapSubscriber<T, R> extends Subscriber<T> {
    final Subscriber<? super R> actual;
    final Func1<? super T, ? extends R> mapper;
    boolean done;
    public MapSubscriber(Subscriber<? super R> actual, Func1<? super T, ? extends R> mapper) {
        this.actual = actual;
        this.mapper = mapper;
    }
    @Override
    public void onNext(T t) {
        ...
    }
    @Override
    public void onError(Throwable e) {
        ...
    }
    @Override
    public void onCompleted() {
        ...
    }
    @Override
    public void setProducer(Producer p) {
        actual.setProducer(p);
    }
}

然后让之前的Observable(也就是例子中的原始的observable)和新的观察者/订阅者(MapSubscriber)发生订阅关系,那么原来的OnSubscribe的call方法便会执行,记住原来的OnSubscribe的call方法的参数subscriber是新的观察者/订阅者(MapSubscriber),所以在call方法调用subscriber的onNext方法:

subscriber.onNext("value is 1");

新的观察者/订阅者(MapSubscriber)的onNext方法便会执行:

static final class MapSubscriber<T, R> extends Subscriber<T> {
    final Subscriber<? super R> actual;
    final Func1<? super T, ? extends R> mapper;
    boolean done;
    public MapSubscriber(Subscriber<? super R> actual, Func1<? super T, ? extends R> mapper) {
        this.actual = actual;
        this.mapper = mapper;
    }
    @Override
    public void onNext(T t) {
        R result;
        try {
            // T 转化为 R
            result = mapper.call(t);
        } catch (Throwable ex) {
            Exceptions.throwIfFatal(ex);
            unsubscribe();
            onError(OnErrorThrowable.addValueAsLastCause(ex, t));
            return;
        }
        // 调用原来观察者(也就是例子中的observer)的onNext方法
        actual.onNext(result);
    }
    ...
}

onNext方法中,先调用mapper的call方法把String转为Integer,然后把Integer的结果传给原来观察者(也就是例子中的observer)的onNext方法中执行。

map变换的基本流程解析完毕~~

RxJava2 Flowable map 变换操作符 目录 1 map接口 2 map图解 3 map示例 1 map接口 <R>Flowable<R> map(Function<? superT,? extends R>mapper) Returns a Flowable that applies a specified function to each item e... 阅读详情

相关推荐

RxJava 2.x 源码分析(三) 变换操作符map和flatMap

RxJava的操作符有很多,一般常用的有变换操作符,其中最主要是map和flatMap,本文将分别来讲解一下它们的实现原理。在上一篇文章:RxJava 2.x 源码分析(二) 线程切换原理中,讲到RxJava框架的执行流程,理解这个对我们源码的阅读是有很大帮助的,所以如果你还不懂的话,请移步到上一篇文章去读一下 一:map的实现原理 老规矩,先上一个例子: Observable.c...

相忘于江湖 441

RXJAVA-Map

map是RxJava中最简单的一个变换操作符了, 它的作用就是对上游发送的每一个事件应用一个函数, 使得每一个事件都按照指定的函数去变化. 用事件图表示如下: package com.netty.demo.vertx; import io.reactivex.*; import io.reactivex.functions.Consumer; import io.reactivex.functions.Function; import lombok.extern.slf4j.Slf4..

大新博客 1564

RxJava框架时序图-map操作符

RxJava框架时序图-map操作符,RxJava框架时序图-map操作符

Rxjava从入门到精通:Rxjava转换操作符之 Map使用示例

Rxjava转换操作符之 Map使用示例

C++ JAVA的专栏 1525

HyperMesh 2025新功能尝鲜:用Volume Tetramesh一键生成工业级四面体网格

HyperMesh 2025推出的Volume Tetramesh功能,通过“体到体”的全新范式,实现了工业级四面体网格的一键生成。该功能利用Proximity与Curvature参数智能识别并加密几何特征,将工程师从繁琐的几何清理和表面网格划分中解放出来,在保证网格质量的同时,显著提升了前处理效率,尤其适用于发动机缸体等复杂模型的仿真分析。

weixin_29229055的博客 477

详细了解sklearn中的CountVectorizer

CountVectorizer 是 scikit-learn(一个流行的 Python 机器学习库)中的一个文本特征提取类,其核心功能是将一系列原始文本(如句子、文档)转换为基于词频(word count)的数值矩阵。它基于词袋模型(Bag of Words, BoW)思想,忽略文本的语法结构和词序,仅关注词汇在文本中出现的频率,从而将文本转化为机器可理解的数字形式。文本 1:"I love machine learning"

2302_76568160的博客 1118

【RxJava】map过程中各个Observable生命周期分析

发生异常时,所有的OnSubscribe都会执行发生异常时,所有的OnFinally都会执行发生异常时,所有的OnComplete都不会执行发生异常时,后续的OnError都会执行发生异常时,后续的OnNext都不会执行发生异常时,后续的Function都不会执行。

天天向上 Up Up Up (*^▽^*) 1665

最新Docker GPU支持全解析:为什么nvidia-smi能用但PyTorch找不到CUDA?

本文深入解析了Docker容器中nvidia-smi命令可用但PyTorch无法调用CUDA的根本原因。关键在于默认配置仅暴露了GPU的utility管理能力,而CUDA计算所需的compute能力未被激活。通过正确设置NVIDIA_DRIVER_CAPABILITIES环境变量为compute,utility,并配合--gpus参数,即可解决此问题,确保AI训练等任务顺利进行。

convnet3designer的博客 238

RxJava(二) map 操作符用法详解

RxJava系列文章目录导读: 一、RxJava create操作符的用法和源码分析 二、RxJava map操作符用法详解 三、RxJava flatMap操作符用法详解 四、RxJava concatMap操作符用法详解 五、RxJava onErrorResumeNext操作符实现app与服务器间token机制 六、RxJava retryWhen操作符...

Chiclaim 2万+

深入理解DQN中的Q值:核心概念和应用

在强化学习中,Q值(或称为动作价值函数)是核心概念之一。Q值函数 ( Q(s, a) ) 表示在给定状态 ( s ) 下,采取动作 ( a ) 并遵循某策略后,智能体从当前状态到未来状态所能获得的预期总回报。简言之,Q值是评估特定状态和动作对的好坏的指标。

qlkaicx的博客 2975

STK相关总结

STK简介 一.SIM卡应用工具包(SIM Application Toolkit),又名CAT/USAT,它包含一系列终端与SIM卡的交互指令,SIM卡可以应用卡内的小应用程序和终端交互,从而实现增值服务的目的,STK包括三种类,STK-imsi切换,STK –OTA,STK-BIP 功能: (1) Profile download:配置下载,开机初始化SIM卡过程中,终端告诉SIM卡终端支持哪些功能,STK中download指终端将数据发送给SIM卡 (2) Proactive command: 主动式

jingjing_2的博客 3356

RxJava 的 Map 变换过程解析

RxJava 的 Map 变换过程解析 这里以 Map 操作符为例解析 RxJava 的变换过程。 Map 操作 RxJava 中使用 Map 操作符的方式如下: private void subscribeMap() { String start = "start:"; Disposable disp = Observable ...

okclouderx的博客 337

RT-DETR改进策略【卷积层】| CVPR2025 GBConv轻量门控瓶颈卷积 低秩瓶颈降参 + 门控聚焦形态,强效捕捉纤细目标

裂缝形态不规则、纹理纤细,传统卷积参数大、计算冗余,且无法动态聚焦裂缝形态;背景噪声强易干扰特征提取,需要轻量且能自适应聚焦裂缝形态的卷积单元,因此提出轻量门控瓶颈卷积 GBC。

Limiiiing的博客 140

RxJava 变换操作符Map

看下文档如下 通过对每个项目应用函数来转换Observable发出的项目 个人理解为转换类型 下面写一个把int 类型转换为String 类型的demo Observable.create(new ObservableOnSubscribe<Integer>() { @Override p...

小牧在一直在学习,在前进的道路上大家一起学习,进步。 487

基于TENG的呼吸测量与识别系统:从蓝牙到WiFi的改造与上位机实现

本文介绍了一种基于摩擦纳米发电机(TENG)的呼吸测量系统改造方案,将原有蓝牙通信升级为WiFi传输。系统通过TENG传感器采集呼吸信号,STM32微控制器处理数据后,经ESP8266 WiFi模块发送至上位机。文中详细阐述了硬件改造(四通道改单通道、蓝牙换WiFi)、嵌入式软件修改(包括ESP8266驱动、数据采集与TCP通信实现)以及上位机软件设计。改造后的系统提升了传输距离和稳定性,为可穿戴健康监测提供了更优解决方案。

huanghm88的专栏 110

滤波电路Multisim电路仿真实验汇总——硬件工程师笔记

本文系统介绍了滤波电路的基础知识及其应用。首先按频率选择性和实现方式对滤波电路进行分类,详细阐述了低通、高通、带通、带阻滤波器以及无源、有源滤波器的特点。接着重点分析了桥式整流电容滤波、电感滤波、LC滤波和CRπ型滤波四种典型电路的工作原理、应用场景及设计要点。通过理论公式和实际案例,指导如何选择滤波元件参数,考虑寄生效应,并通过仿真验证设计效果。最后提供了硬件工程师笔试面试相关的技术资源链接,包括器件知识、电路仿真及企业真题解析等内容。本文可作为电子电路设计领域工程技术人员的学习参考资料。

XU157303764的博客 2166

Rxjava 2.x 源码系列 - 变换操作符 Map(上)

在前几篇博客中,我们介绍了 Rxjava Observable 与 Observer 之间是如何订阅与取消订阅的,以及 Rxjava 是如何控制 subsribe 线程和 observer 的回调线程的。今天,让我们一起来看一下 Rxjava 中另外一个比较重要的功能,操作符变化功能OK,我们在回到上面的 demo,来整理一下他的流程。

IT徐师兄 188

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

RxJava源码解析03-变换过程(map)

RxJava源码解析03-变换过程(map)map操作符将一个Observable转化为一个新的Observable对象并发射。Observable.just(123) .map(new Func1<Integer, String>() { @Override public String call(Integer integer) {

朱豪凯的博客 635

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

RxJava【变换】操作符 map flatMap concatMap buffer MD

Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina.com RxJava【变换】操作符 map flatMap concatMap buffer MD...

weixin_30732825的博客 94

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

RxJava的学习之变换操作符—map

定义:Map操作符对原始Observable发射的每一项数据应用一个你选择的函数,然后返回一个发射这些结果的Observable。 基本格式:map(Func1) map函数只有一个参数,参数一般是Func1,它的两个类型参数,一个是输入的类型,一个是输出的类型。对Observable发射的每一项数据应用一个函数,执行变换操作。官方流程图: 代码示例: map的基本用法: Person

源代码的博客 557

Android函数响应式编程——必学的RxJava变换操作符map、flatMap、cast、concatMap、flatMapIterable、buffer、groupBy

gradle // RxJava compile 'io.reactivex:rxjava:1.2.0' compile 'io.reactivex:rxandroid:1.2.1' 变换操作符:对被观察者(Oberserver)要发射的数据进行修改,修改后再发送出去。 1.map:把你原来观察者的数据进行修改(Retrofit就是采

qq_36523667的博客 981

Rxjava(变换类)--map

对Observable发射的每一项数据应用一个函数,执行变换操作 Observable.just(1).map(new Func1() { @Override public Integer call(Integer integer) { return integer + 1;

new_abc的专栏 635

RxJava实战:变换操作符map的使用姿势及技巧

map变换操作符的作用是把每一个(T类型的)Observable通过一些列代码变换成另外一种(R类型的)Observable 也就是图上的把圆圈变成三角。 Observable就是流,把他当做一种结构,这种结构具有类型, 这种类型可以应用rx操作。然后实际进行RX操作的时候操作的其实是对应的类型的对象。

gengqiquan的博客 4211

RxJava源码分析(map,flatmap和类型变换)

目录 RxJava简介 RxJava源码分析(map方法) 简单示例 源码分析 示例代码执行 小结 RxJava源码分析(flagmap方法) 简单示例 源码分析 示例代码执行 小结 RxJava简介 RxJava是现在大火的一个异步框架,他代码简洁好懂,功能强大,扩展性高,维护难度小。 RxJava最具特色的就是他的类型变换了,这是RxJava最难理解的一部分,也是R...

yan245294305的博客 817
上一篇: Rxjava - 基本流程
下一篇: Rxjava - flapMap变换
JohanMan
博客等级 码龄10年 72粉丝 131原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值