前言
本文最初是為部門內部培訓而準備的,但經過一番調研發現,同事們用不慣 RxJava,並不是因為網上介紹 “怎麼用” 的教程不夠多,恰恰是因為,一上來就急著發車的教程無數、卻從未有過哪篇教程 捨得用幾句話的功夫點破 RxJava 操作符究竟為何方神聖、我們為什麼要用、為什麼要那樣用。
Observable.just(1, 3, 5, 7, 9)
.map(i -> i + 1)
.filter(i -> i < 5)
.subscribe(getObserve());
複製程式碼
事實上,在相當長的一段時間裡,我也和大部分人一樣,只知道使用 RxJava 來完成非同步回撥,至於那些操作符,則是能不用盡量不用,因為不知道葫蘆裡賣的什麼藥,看不懂、不會用。
因此,本文的初衷絕不是翻譯官方文件、教大家怎麼用,而是旨在幫助大家對 RxJava 操作符 完成感性上的認識。鑑於本次培訓的效果還不錯、同事們聽了都說好,我便在 GitHub 開源了全套操作符示例程式碼(不要慌,連結文末已給出)。如果你在閱讀本文後覺得恍然大悟,原來 RxJava 操作符是這麼回事,那麼我的願望也就達到了。
程式語言包含多種程式設計正規化
我對操作符本質的頓悟,始於我對程式語言的理解。和你一樣,我是做安卓開發,但有一天,我決定跳出 Java,從整個電腦科學的角度來學習和理解程式語言的本質,在這過程中,我接觸了“程式設計正規化”這個概念,瞭解到原來每個程式語言大都包含多種程式設計正規化。
常見的程式設計正規化有:指令式程式設計、宣告式程式設計等。
以 Java 為例,我們們 Java 最主要的程式設計正規化是指令式程式設計。指令式程式設計 即按順序執行具體的命令,這些命令不僅交待了做什麼,還詳細交待了每一步怎麼做。
SQL 也是種程式語言,是一種典型的宣告式程式設計。宣告式程式設計的特點是,只交待做什麼,但無須交待怎麼做。
操作符的本質是宣告式程式設計
下面回到我們最初的問題上來。你之所以用不慣 RxJava 操作符,是因為你習慣性地使用指令式程式設計思維 來理解實際上是宣告式程式設計的操作符。 學習操作符,就和你在大學裡接受的 SQL 語句一樣理所當然。
SQL 你是理解的,就是按一定的規則,向資料庫中的資料宣告你要做什麼。
同理,RxJava 也是按一定的規則,向資料流宣告你要做什麼。
轉換成程式碼,便成為以下這樣。
Observable.just(1, 3, 5, 7, 9)
.map(i -> i + 1)
.filter(i -> i < 5)
.subscribe(getObserve());
複製程式碼
這樣說,你理解了嗎?
全套操作符示例程式碼