android中使用java8新特性lambda表達式


前言

  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語言特性所帶來的業務邏輯代碼“可讀性、可維護性”仍然是非常具有價值的


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM