RxJava 復刻簡版之三,map 多次中轉數據

案例代碼:https://gitee.com/bobidali/lite-rx-java/commit/292e9227a5491f7ec6a07f395292ef8e6ff69290

RxJava 的調用第一步是封裝了觀察者接受了數據的處理,進一步就是使用 map 將數據操作傳遞給上下游

1、類似Observer.create 創建一個簡單的觀察者

abstract class Single<T> : SingleSource<T> {companion object {@JvmStaticfun <T> just(item: T): Single<T> {return RxJavaPlugins.onAssembly(SingleJust(item))}}override fun subscribe(observer: SingleObserver<in T>) {Objects.requireNonNull(observer, "observer is null")try {var obsv = observerobsv = RxJavaPlugins.onSubscribe(this, obsv)subscribeActual(obsv)} catch (e: NullPointerException) {throw e} catch (e: Throwable) {throw NullPointerException("subscribeActual failed").initCause(e)}}protected abstract fun subscribeActual(observer: SingleObserver<in T>)
}
class SingleJust<T>(private val value: T) : Single<T>() {override fun subscribeActual(observer: SingleObserver<in T>) {observer.onSubscribe(Disposable.disposed())observer.onSuccess(value)}
}

2、在SingleObserver 中加入map 方法實現數據的承上啟下

    fun <R> map(mapper: com.example.literj.kt.internal.functions.Function<in T, out R>): Single<R> {Objects.requireNonNull(mapper, "mapper is null")return RxJavaPlugins.onAssembly(SingleMap(this, mapper))}
class SingleMap<T, R>(private val source: SingleSource<out T>,private val mapper: Function<in T, out R>
) : Single<R>() {override fun subscribeActual(observer: SingleObserver<in R>) {source.subscribe(MapSingleObserver(observer, mapper))}internal class MapSingleObserver<T, R>(private val t: SingleObserver<in R>,private val mapper: Function<in T, out R>) : SingleObserver<T> {override fun onSuccess(t: T) {val v: Rtry {v = Objects.requireNonNull(mapper.apply(t),"The mapper function returned a null value.")} catch (e: Throwable) {onError(e)return}this.t.onSuccess(v)}override fun onSubscribe(d: Disposable) {t.onSubscribe(d)}override fun onError(e: Throwable) {t.onError(e)}}
}

3、鐺鐺,完成,看看調用案例

    public static void sample3() {String tag = "sample3";Log.d(TAG + " " + tag, "start");Single.just(777).map(data1 -> 777).map(data2 -> 888).subscribe(getSingleObserver(tag));}
2023-08-13 11:58:23.703 21522-21522/com.example.literj D/RxJavaTestUtil sample3: start
2023-08-13 11:58:23.713 21522-21522/com.example.literj D/RxJavaTestUtil sample3: onSubscribe
2023-08-13 11:58:23.713 21522-21522/com.example.literj D/RxJavaTestUtil sample3: onSuccess = 888

ok,那么下一篇就加入線程切換

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/40347.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/40347.shtml
英文地址,請注明出處:http://en.pswp.cn/news/40347.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

神經網絡基礎-神經網絡補充概念-05-導數

概念 導數是微積分中的一個概念&#xff0c;用于描述函數在某一點的變化率。在數學中&#xff0c;函數的導數表示函數值隨著自變量的微小變化而產生的變化量&#xff0c;即斜率或變化率。 假設有一個函數 f(x)&#xff0c;其中 x 是自變量&#xff0c;y f(x) 是因變量。函數…

如何評價機械革命?

機械革命是在全球頂尖IT廠商藍天、intel、nvidia、Microsoft等聯手的打造下推出的中高端品牌。&#xff08;零件組裝&#xff09; 機械革命研發實力雄厚&#xff0c;糟糕的外觀設計和極致的游戲性能一樣出名。圖片皆來自于未來世界。

【0214】postgres后端進程session退出,如何通過日志分析其會話信息

文章目錄 1. postgres進程session退出2. 開啟日志記錄postgres進程會話狀態3. postgres進程會話結束,記錄日志的實現原理1. postgres進程session退出 默認情況下,新建一個postgres后端進程會話(session),或是postgres進程正常/異常退出時,日志中沒有很明顯的記錄用于說明…

嵌入式:ARM Day4

一、自己編寫代碼實現三盞燈點亮 源碼&#xff1a; .text .global _start _start: 進行一次初始化bl RCC_INITbl LED1_INITbl LED2_INITbl LED3_INITb looploop: 循環開關燈bl LED1_ONbl delay_1sbl LED1_OFFbl delay_1sbl LED2_ONbl delay_1sbl LED2_OFFbl delay_1sbl…

如何進行網絡活動監控

組織的 IT 基礎架構中的每個網絡設備上都發生了大量活動&#xff0c;例如數據包傳輸、來自網絡協議的消息、設備狀態事件等。網絡活動成為在檢測到問題時識別網絡瓶頸的面包屑&#xff0c;因此即使是最微小的網絡活動也應受到監控&#xff0c;因為它直接影響整體網絡性能、運行…

UI設計師個人工作總結范文精選

UI設計師個人工作總結范文(一) 在忙忙碌碌中&#xff0c;2019年又將過去了&#xff0c;在這一年當中&#xff0c;設計部無論是在運作模式、設計產值、還是人員結構&#xff0c;各方面的變化都比較大。 設計部的運作模式是從7月底開始進行調整的&#xff0c;以獨立承包制的運營方…

爬蟲抓取數據時顯示超時,是代理IP質量不行?

很多人在做數據抓取的時候&#xff0c;會遇到顯示超時了&#xff0c;然后就沒有響應了。這是什么原因的&#xff1f;有的人回答是使用的代理IP質量不行&#xff0c;這種答案&#xff0c;對也不對。 數據抓取時&#xff0c;出現超時的原因時多方面影響的&#xff0c;主要分為目標…

python爬蟲5:requests庫-案例3

python爬蟲5&#xff1a;requests庫-案例3 前言 ? python實現網絡爬蟲非常簡單&#xff0c;只需要掌握一定的基礎知識和一定的庫使用技巧即可。本系列目標旨在梳理相關知識點&#xff0c;方便以后復習。 申明 ? 本系列所涉及的代碼僅用于個人研究與討論&#xff0c;并不會對網…

hivesql-dayofweek 函數

返回日期或時間戳的星期幾。 此函數是 extract(DAYOFWEEK FROM expr) 的同義函數。 語法 dayofweek(expr) 參數 expr&#xff1a;一個 DATE 或 TIMESTAMP 表達式。 返回 一個 INTEGER&#xff0c;其中 1 Sunday 和 7 Saturday。 示例 > SELECT dayofweek(2009-07-30)…

mysql 01.三范式,數據類型

01.概念的區分&#xff1a; mysql是屬于DBMS層次的&#xff0c;sql語句是用于DBMS的語句。 02.sql語句詳細介紹&#xff1a; SQL的概述Structure Query Language(結構化查詢語言)簡稱SQL&#xff0c;它被美國國家標準局(ANSI)確定為關系型數據庫語言的美國標準&#xff0c;后…

神經網絡基礎-神經網絡補充概念-37-其他正則化方法

概念 L1 正則化&#xff08;Lasso Regularization&#xff09;&#xff1a;L1 正則化通過在損失函數中添加參數的絕對值之和作為懲罰項&#xff0c;促使部分參數變為零&#xff0c;實現特征選擇。適用于稀疏性特征選擇問題。 L2 正則化&#xff08;Ridge Regularization&…

conda常用命令及國內鏡像源

conda命令使用介紹 啟動conda source ~/.bashrc幫助目錄 conda create -h檢查conda版本 conda --version升級當前版本的conda conda update conda環境管理 列出所有的環境 conda info -e conda env list安裝一個不同版本的python新環境 conda create --name py27 pytho…

PHP FTP的相關函數及簡單使用示例

簡介 FTP是ARPANet的標準文件傳輸協議&#xff0c;該網絡就是現今Internet的前身。 PHP FTP函數是通過文件傳輸協議提供對文件服務器的客戶端訪問&#xff0c;FTP函數用于打開、登陸以及關閉連接&#xff0c;也用于上傳、下載、重命名、刪除以及獲取服務器上文件信息。 安裝 …

Ubuntu下mysql8開啟遠程連接

環境 mysql8ubuntu22.04 更改配置文件 vim /etc/mysql/mysql.conf.d/mysqld.conf找到 bind-address 127.0.0.1 mysqlx-bind-address 127.0.0.1 把這兩行注釋掉&#xff0c;保存退出即可 修改mysql配置 登錄mysql創建一個遠程連接賬戶,名字任意&#xff0c;密碼任意,用戶名…

前端高頻面試題 Day02

面試題 var 和 let const 的區別 var 是 ES5 及之前的語法&#xff0c;let const 是 ES6 語法var 和 let 是變量&#xff0c;可修改&#xff1b;const 是常量&#xff0c;不可修改var 有變量提升&#xff0c;let const 沒有var 沒有塊級作用域&#xff0c;let const 有 &…

JavaWeb-DAO設計模式

目錄 DAO設計模式 1.認識DAO 2.DAO各部分的詳解 3.DAO設計模式流程 DAO設計模式 1.認識DAO DAO(Data Acess Object 數據庫訪問對象)的主要功能是操作數據庫&#xff0c;所以DAO在標準開發架構中數據數據層&#xff0c;以下是標準開發的架構 客戶層&#xff1a;目前使用B/…

vue中style scoped屬性的作用

一、為什么要給style 節點加 scoped 屬性&#xff08;vue&#xff09; 1、作用&#xff1a;當style標簽里面有scoped屬性時&#xff0c;它的css只作用于當前組建的元素。在單頁面項目中可以使組件之間互不污染&#xff0c;實現模塊化&#xff08;實現組件的私有化&#xff0c;不…

Ubuntu安裝mysql5.7

目錄 1. 更新系統軟件包2. 安裝MySQL 5.73. 啟動MySQL 服務4. 設置MySQL root 密碼5. 驗證MySQL 安裝6. 啟用遠程訪問7. 創建新用戶8. 為新用戶授予權限9. mysql命令 以Ubuntu 18.04系統為例&#xff0c;安裝MySQL 5.7。操作步驟如下&#xff1a; 1. 更新系統軟件包 sudo apt…

Openai中的tokens怎么估計

大規模語言模型&#xff08;LLM&#xff09;的出現給自然語言處理領域帶來了變革的可能性&#xff0c;Openai開放了chatgpt的API&#xff0c;方便了開發人員使用LLM的推理能力&#xff0c;注冊時贈送5美元的使用額度&#xff0c;有效期3個月。 如果想便捷的使用chatgpt的API&a…

介紹 TensorFlow 的基本概念和使用場景

TensorFlow 是一種開源的機器學習框架&#xff0c;由 Google 開發。它是用來構建和訓練機器學習模型的強大工具&#xff0c;支持很多種不同類型的機器學習算法&#xff0c;并使用數據流圖來表示計算過程。 TensorFlow 的核心是張量 (Tensor) 和計算圖 (Graph)。 張量 (Tensor)…