前言
java語言自從走入SE8版本就異常的讓開發者感到興奮,隨之而來的rxjava系列等(類似於javaScript的Promise A+)的functional programing瞬間風起雲涌,另不少java開發者眼前一亮 並且看到了java的閃亮的未來
但是,作為android平台的一名App開發者,如果我們想在android App開發過程中使用java8的新特性那可能就另當別論了,因此今天這篇隨筆就來討論討論“如何在android應用開發中使用java8新特性”
android和java
當我們一開始接觸android應用開發的那刻起,我們就被告知使用java語言來編寫android程序,我們要安裝java環境,在IDE中使用java的API去編寫代碼邏輯。我們使用java 6/7中java EE代碼中常見的幾乎所有語法和代碼;我們很少發現當把一些java EE項目的java代碼原封不動移植到android應用中會出現什么問題,並且我們很少被告知android sdk的API實質上只是標准java SE API的一個子集;另外,很少有人學習完用如何用Activity、Fragment等控件結合簡單的java代碼寫出一個可以在手機上運行后緊接着去繼續學習,去繼續學習android frameWork以及native層與Linux底層的實現。
在這里我不想大談特談android的實現機制和原理,只想拋磚引玉的提醒一下:
android !=java
為何需要使用java8的新特性
如果你能了解下“函數式編程(functional programing)”以及“響應式編程(reactive programing)”的魅力的話,那么你就會慢慢喜歡上他,簡潔、高效的風格,如果從前你的業務邏輯代碼是“面向數據抽象”的那么有了他們那就是“面向行為抽象”了
來點栗子吧,比如下面這段代碼
int count = 0; for (Artist artist:allArtists){ if(artist.isFrom("London")){ count++; } }
或者使用Iterator
其實完全可以寫成這樣:
long count = allArtists.stream() .filter(artist->artist.isFrom("London")) .count();
一目了然。。。
具體java8中lambda表達式以及集合類中的stream的進階知識不在這里講解了,今天的目的是介紹在android開發當中如何使用java8特性
如何做
https://developer.android.google.cn/guide/platform/j8-jack.html?hl=zh-cn#supported-features
現在的android sdk已經可以正常使用java7之前所有語言特性了,但java8仍然只能在個別sdk level上使用,如鏈接里面android developer文檔中所述,使用jack可以讓android使用部分java8的特性,而且仍然受困於sdk的版本支持;
那么如何做?才可以盡情的使用java8的語言特性在android中任何sdk版本中暢游呢?
gradle-retrolambda
https://github.com/evant/gradle-retrolambda,在android studio的構建工具gradle中使用該plugin,便可以做到在任何sdk版本種使用java 8語言新特性了。
當然,如果你仔細思考下它實現的原理不難發現,其實他跟jack類似工作在.class文件跟.dex文件這個階段,它實質上是吧你編寫的java8代碼轉化為java6/7的代碼了而已,但即便如此,java8語言特性所帶來的業務邏輯代碼“可讀性、可維護性”仍然是非常具有價值的