为什么我不再推荐你用 RxJava ?
开发者技术前线
共 5225字,需浏览 11分钟
·
2021-04-13 23:54
让一部分开发者看到未来
先讲讲历史
再聊聊异步
CompletableFuture
。还是后起之秀Kotlin上的Coroutine
,还有Android 上官方提供的LiveData
(这里说下:虽然本质上线程管理仍需用户自己,但是常见的比如Room数据库,Retrofit等等都有现成的LiveDataAdapter,实际上并不需要我们过多操心线程问题)。相比之下,RxJava优势并不那么明显,相反劣势却很突出。RxJava 门槛太高
投入高,收获少
你永远无法预测你同事的RxJava水平
RxJava的行为并不可预
map
和flatMap
的区别。还有flatMap
和concatMap
的区别。简单的讲map
是一对一,flatMap
是一对N的map然后在进行flatten
操作。还有些教程直接写出flatMap
无序,concatMap
有序。其实这些都只是简单总结,而实际的行为照着相差甚远。比如flatMap
在第一个error的时候会不会继续继续触发第二个?如果我想继续,将如何操作?再比如concatMap
在遇到第一个Observable
不会中断的时候,怎么继续下一个?RxJava太容易出错
with great power comes great responsibility. RxJava就是这样。在简单易用的同时他太容易被滥用了。我在实际工作中碰到的例子:
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的思想。总结:RxJava虽然优秀,但并不适合所有人
END 前线推出学习交流一定要备注:研究/工作方向+地点+学校/公司+昵称(如JAVA+上海+上交+卡卡),根据格式备注,可更快被通过且邀请进群 扫码加我微信进群,内推和技术交流,大佬们零距离
历史推荐
为什么我立刻放弃了 React 而使用 Vue ? 记住看小电影前一定要检查域名是不是 HTTPS 的! 为什么面试官喜欢问 ZooKeeper 基本原理? Vue 3.0 重磅发布!为什么开发者依旧偏爱 React? 好文点个在看吧!
评论