為什么我不再推薦你用 RxJava ?
讓一部分開發(fā)者看到未來

先講講歷史
再聊聊異步
CompletableFuture。還是后起之秀Kotlin上的Coroutine,還有Android 上官方提供的LiveData(這里說下:雖然本質(zhì)上線程管理仍需用戶自己,但是常見的比如Room數(shù)據(jù)庫,Retrofit等等都有現(xiàn)成的LiveDataAdapter,實(shí)際上并不需要我們過多操心線程問題)。相比之下,RxJava優(yōu)勢(shì)并不那么明顯,相反劣勢(shì)卻很突出。RxJava 門檻太高
投入高,收獲少
你永遠(yuǎn)無法預(yù)測(cè)你同事的RxJava水平
RxJava的行為并不可預(yù)
map和flatMap的區(qū)別。還有flatMap和concatMap的區(qū)別。簡(jiǎn)單的講map是一對(duì)一,flatMap是一對(duì)N的map然后在進(jìn)行flatten操作。還有些教程直接寫出flatMap無序,concatMap有序。其實(shí)這些都只是簡(jiǎn)單總結(jié),而實(shí)際的行為照著相差甚遠(yuǎn)。比如flatMap在第一個(gè)error的時(shí)候會(huì)不會(huì)繼續(xù)繼續(xù)觸發(fā)第二個(gè)?如果我想繼續(xù),將如何操作?再比如concatMap在遇到第一個(gè)Observable不會(huì)中斷的時(shí)候,怎么繼續(xù)下一個(gè)?RxJava太容易出錯(cuò)
with great power comes great responsibility. RxJava就是這樣。在簡(jiǎn)單易用的同時(shí)他太容易被濫用了。我在實(shí)際工作中碰到的例子:
val stationId = "5bCP6Iqx"
val statoin:Observable<Station> = staionRepo.getStationById(stationId)
val stationLine:Observable<StationLine> = station.flatMap{station ->stationRepo.getLine(station)}
return Observable.merge(station.map{it.toUiModel()},
stationLine.map{it.toUiModel()})
val stationId = "5bCP6bif"
val statoin:Observable<Station> = staionRepo.getStationById(stationId)
return station.publish{selector ->
Observable.merge(selector.map{it.toUiModel()},
selector.flatMap{station -> stationRepo.getLine(station)}
.map{it.toUiModel()})
}
RxJava還是過于理想化了
RxJava起于異步,卻也不單單是異步
LiveData。而LiveData無疑也是大量借鑒了RxJava的思想。總結(jié):RxJava雖然優(yōu)秀,但并不適合所有人
END 前線推出學(xué)習(xí)交流一定要備注:研究/工作方向+地點(diǎn)+學(xué)校/公司+昵稱(如JAVA+上海+上交+卡卡),根據(jù)格式備注,可更快被通過且邀請(qǐng)進(jìn)群 掃碼加我微信進(jìn)群,內(nèi)推和技術(shù)交流,大佬們零距離
歷史推薦
為什么我立刻放棄了 React 而使用 Vue ? 記住看小電影前一定要檢查域名是不是 HTTPS 的! 為什么面試官喜歡問 ZooKeeper 基本原理? Vue 3.0 重磅發(fā)布!為什么開發(fā)者依舊偏愛 React? 好文點(diǎn)個(gè)在看吧!
評(píng)論
圖片
表情


