Rxjava2入門(mén)教程一:函數(shù)響應(yīng)式編程及概述(轉(zhuǎn))

如需下載源碼,請(qǐng)?jiān)L問(wèn)

https://github.com/fengchuanfang/Rxjava2Tutorial

文章原創(chuàng),轉(zhuǎn)載請(qǐng)注明出處:

Rxjava2入門(mén)教程一:函數(shù)響應(yīng)式編程及概述

RxJava是函數(shù)響應(yīng)式編程思想在java語(yǔ)言上的具體實(shí)現(xiàn)。RxJava2不是基于RxJava1的父子繼承關(guān)系,而是同屬這一具體實(shí)現(xiàn)下的同胞兄弟;所以,如果之前沒(méi)接觸過(guò)RxJava,在學(xué)習(xí)RxJava2之前不需要了解已經(jīng)過(guò)時(shí)的RxJava1。

函數(shù)響應(yīng)式編程函數(shù)式編程響應(yīng)式編程這兩大顛覆傳統(tǒng)的牛逼編程范式疊加后的產(chǎn)物,編程界的牛逼二次方。

響應(yīng)式編程(Reactive Programming):是一種面向數(shù)據(jù)流和變化傳播的一種編程范式。其中變化傳播在程序中也是轉(zhuǎn)換為數(shù)據(jù)流的形式進(jìn)行處理。

其實(shí),響應(yīng)式編程便是發(fā)射,流轉(zhuǎn),監(jiān)聽(tīng),響應(yīng)數(shù)據(jù)流的一套編程范式。在流轉(zhuǎn)的過(guò)程中可以對(duì)數(shù)據(jù)流進(jìn)行過(guò)濾,轉(zhuǎn)變,合并,去重等方式的處理

響應(yīng)式編程的終極思想,一切皆流(everything is stream)。根據(jù)唯物辯證法的思想,物質(zhì)世界是普遍聯(lián)系和不斷運(yùn)動(dòng)變化的統(tǒng)一整體,而一切‘運(yùn)動(dòng)變化’這一‘客觀現(xiàn)象’都可以通過(guò)數(shù)據(jù)流進(jìn)行‘抽象描述’,也可以說(shuō),物質(zhì)世界是數(shù)據(jù)流的客觀存在。

在程序中數(shù)據(jù)流是輕量而常見(jiàn)的,變量,數(shù)組,集合,對(duì)象,事件都可當(dāng)做數(shù)據(jù)流來(lái)發(fā)送處理。

例如:

界面數(shù)據(jù)的展示:可以將要展示的數(shù)據(jù)由其數(shù)據(jù)源(網(wǎng)絡(luò)請(qǐng)求,數(shù)據(jù)庫(kù)查詢等)將其以數(shù)據(jù)流的形式進(jìn)行發(fā)出,通過(guò)一系列的傳遞,轉(zhuǎn)變(后臺(tái)線程傳遞到UI線程,對(duì)數(shù)據(jù)進(jìn)行條件過(guò)濾等),交給界面,界面在拿到數(shù)據(jù)后,做出相應(yīng)的響應(yīng),將其展示出來(lái)。

用戶動(dòng)作的交互:可以將一些用戶輸入事件(觸摸屏幕,點(diǎn)擊鼠標(biāo),敲擊鍵盤(pán)等),轉(zhuǎn)換為約定的數(shù)據(jù)符號(hào),將其以數(shù)據(jù)流的形式發(fā)送,通過(guò)層層傳遞,交給相應(yīng)的窗口,窗口交給相應(yīng)的控件,控件監(jiān)聽(tīng)到相應(yīng)的事件后,響應(yīng)用戶的行為。

函數(shù)式編程(Functional programming):是一種通過(guò)函數(shù)或者函數(shù)的組合調(diào)用來(lái)處理數(shù)據(jù),獲取結(jié)果的一種編程范式。

函數(shù)是函數(shù)式編程的核心,相當(dāng)于對(duì)象在面向?qū)ο缶幊讨械牡匚灰粯印T诤瘮?shù)式編程中,函數(shù)可以獨(dú)立地解決特定的問(wèn)題,可以通過(guò)與其他函數(shù)的組合調(diào)用來(lái)解決復(fù)雜的問(wèn)題,可以作為另一個(gè)函數(shù)的參數(shù),可以返回一個(gè)新的函數(shù),也可以當(dāng)做變量在函數(shù)之間或函數(shù)內(nèi)部傳遞。

在函數(shù)式編程中,純函數(shù)高階函數(shù)是兩大重要的角色。

純函數(shù)具有相互獨(dú)立性和對(duì)外封閉性特點(diǎn):

1、純函數(shù)的返回結(jié)果只受函數(shù)參數(shù)的影響,如果輸入?yún)?shù)相同不論在哪調(diào)用,何時(shí)調(diào)用,調(diào)用多少次其輸出結(jié)果都是一樣的。

2、純函數(shù)內(nèi)部的數(shù)據(jù)處理不受外部環(huán)境的影響也不會(huì)影響外部環(huán)境,每一個(gè)函數(shù)內(nèi)部均有一套屬于自己的局部變量,只在本函數(shù)內(nèi)部調(diào)用也只在本函數(shù)內(nèi)部起作用,其取值由函數(shù)的初始參數(shù)決定,不受外部變量的影響,同時(shí)函數(shù)的計(jì)算結(jié)果只影響函數(shù)的返回值,不影響外部變量的值。

高階函數(shù)(Higher-order function):允許將函數(shù)作為參數(shù)傳入,或者將函數(shù)作為返回值返回的函數(shù)稱為高階函數(shù)。通過(guò)高階函數(shù)可以對(duì)純函數(shù)進(jìn)行傳遞,組合,鏈接等操作來(lái)解決不能靠單一函數(shù)解決的復(fù)雜問(wèn)題。

當(dāng)遇到單一函數(shù)無(wú)法解決的復(fù)雜問(wèn)題時(shí),可以將其化整為零,拆分成能被單一函數(shù)處理的小問(wèn)題,然后通過(guò)高階函數(shù)對(duì)這些單一函數(shù)進(jìn)行組合,鏈接,順序調(diào)用進(jìn)行解決。

下面分別用面向?qū)ο缶幊?,響?yīng)式編程和函數(shù)式編程來(lái)解決把大象關(guān)進(jìn)冰箱的問(wèn)題。

面向?qū)ο缶幊蹋?/p>

第一步:構(gòu)建一個(gè)冰箱,具有開(kāi)門(mén),關(guān)門(mén)的方法

第二步:構(gòu)建一個(gè)大象,具有走進(jìn)冰箱的方法

第三步:實(shí)例化一個(gè)冰箱對(duì)象,實(shí)例化一個(gè)大象對(duì)象,冰箱對(duì)象調(diào)用開(kāi)門(mén)方法,大象對(duì)象調(diào)用走進(jìn)冰箱方法,冰箱對(duì)象調(diào)用關(guān)門(mén)方法,大象被成功裝入冰箱。

響應(yīng)式編程:

第一步:構(gòu)建一個(gè)發(fā)射源,發(fā)送大象

第二步:構(gòu)建一個(gè)響應(yīng)器,接受到大象后關(guān)進(jìn)冰箱。

第三步:用這個(gè)響應(yīng)器監(jiān)聽(tīng)發(fā)射源。

函數(shù)式編程:

第一步:構(gòu)建一個(gè)函數(shù),接收大象和冰箱兩個(gè)參數(shù)

第二步:在此函數(shù)內(nèi)部做實(shí)現(xiàn),返回冰箱已經(jīng)裝入大象

第三步:調(diào)用此函數(shù),將大象和冰箱作為參數(shù)傳入

函數(shù)響應(yīng)式編程(Functional Reactive Programming:FRP):是一種通過(guò)一系列函數(shù)的組合調(diào)用來(lái)發(fā)射,轉(zhuǎn)變,監(jiān)聽(tīng),響應(yīng)數(shù)據(jù)流的編程范式。

在RxJava中,函數(shù)響應(yīng)式編程具體表現(xiàn)為一個(gè)觀察者(Observer)訂閱一個(gè)可觀察對(duì)象(Observable),通過(guò)創(chuàng)建可觀察對(duì)象發(fā)射數(shù)據(jù)流,經(jīng)過(guò)一系列操作符(Operators)加工處理和線程調(diào)度器(Scheduler)在不同線程間的轉(zhuǎn)發(fā),最后由觀察者接受并做出響應(yīng)的一個(gè)過(guò)程。

在RxJava2中,提供了五對(duì)觀察者模式組合來(lái)完成這一系列的過(guò)程,每一對(duì)組合依靠其可調(diào)用的一系列函數(shù)的差異,而具有各自的特點(diǎn)。

這五類組合(前為可觀察對(duì)象后為對(duì)應(yīng)的觀察者)分別是:

第一組:ObservableSource/Observer

一次可發(fā)送單條數(shù)據(jù)或者數(shù)據(jù)序列onNext,可發(fā)送完成通知onComplete或異常通知onError,不支持背壓。

第二組:Publisher/Subscriber

第一組基礎(chǔ)上進(jìn)行改進(jìn),支持背壓,一次可發(fā)送單條數(shù)據(jù)或者數(shù)據(jù)序列onNext,可發(fā)送完成通知onComplete或異常通知onError,但效率沒(méi)有第一組高。

第三組:SingleSource/SingleObserver

第一組簡(jiǎn)化版,只能發(fā)送單條數(shù)據(jù)onSuccess,或者異常通知onError

第四組:CompletableSource/CompletableObserve

第一組簡(jiǎn)化版,不能發(fā)送數(shù)據(jù),只發(fā)送完成通知onComplete或者異常通知onError

第五組:MaybeSource/MaybeObserver

第三,第四組的合并版,只能發(fā)送單條數(shù)據(jù)onSuccess和完成通知onComplete或者發(fā)送一條異常通知onError

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容