java語言自從走入SE8版本就異常的讓開發者感到興奮,隨之而來的rxjava系列等(相似於javaScript的Promise A+)的functional programing瞬間風起雲涌,另很多java開發者眼前一亮 而且看到了java的閃亮的將來html
可是,做爲android平臺的一名App開發者,若是咱們想在android App開發過程當中使用java8的新特性那可能就另當別論了,所以今天這篇隨筆就來討論討論「如何在android應用開發中使用java8新特性」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底層的實現。react
在這裏我不想大談特談android的實現機制和原理,只想拋磚引玉的提醒一下:android
android !=javagit
若是你能瞭解下「函數式編程(functional programing)」以及「響應式編程(reactive programing)」的魅力的話,那麼你就會慢慢喜歡上他,簡潔、高效的風格,若是從前你的業務邏輯代碼是「面向數據抽象」的那麼有了他們那就是「面向行爲抽象」了github
來點栗子吧,好比下面這段代碼編程
int count = 0; for (Artist artist:allArtists){ if(artist.isFrom("London")){ count++; } }
或者使用Iterator
其實徹底能夠寫成這樣:ide
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版本中暢遊呢?
https://github.com/evant/gradle-retrolambda,在android studio的構建工具gradle中使用該plugin,即可以作到在任何sdk版本種使用java 8語言新特性了。
固然,若是你仔細思考下它實現的原理不難發現,其實他跟jack相似工做在.class文件跟.dex文件這個階段,它實質上是吧你編寫的java8代碼轉化爲java6/7的代碼了而已,但即使如此,java8語言特性所帶來的業務邏輯代碼「可讀性、可維護性」仍然是很是具備價值的