如何在Android N 預覽版中使用Java8的新特性
Android團隊發布的Android N Preview中給我們帶來了很多提升,包括由Jack編譯器提供的Java 8支持。在這篇文章中,我們將來看看它究竟對Android開發者意味著什么,以及如何嘗試新的語言特性。
概覽
在這篇文章中,去介紹Oracle Java 8的新特性并沒有太大意義 —— 很多信息已經在互聯網上有了。
另一方面,Android 官方的Java 8公告留下了很多開放的問題給開發者們,感覺上并非所有的原生 Java 8 功能都是可用的。更詳細的 技術公告確認了這一點。我們可以根據在 Android N 中的可用性,將這些語言特性分類如下:
Android Gingebread (API 9)及以上:
-
Lambda 表達式
-
java.util.function
Android N及以上:
-
默認和靜態interface方法
-
可重復的注解
-
流(Streams)
-
反射APIs
所以對Java 8特性和使用的minSdkVersion之間的關聯性,開發者必須去精心選擇。我們也必須注意到語言向后兼容是由Jack編譯器提供的。在概念上,Jack編譯器將javac,ProGuard,以及dex的功能合并 到了一個轉換步驟中。這意味著其中沒有中間的Java字節碼可用,且像是JaCoCo和Mockito的工具將無法工作,DexGuard也一樣 (ProGuard的企業版本)。讓我們祈禱這只是一個早期的preview版本,且這些問題將在未來被修復。
Lambda表達式以及相關的函數功能APIs —— 這是一個每個Android開發都會喜歡的東西。這類功能將會對增加代碼可讀性極為有用 —— 它替代了提供事件監聽器的匿名內部類。而之前只能通過額外的工具來實現,或者由Android Studio編輯器去折疊代碼。
默認及靜態interface方法可以幫助我們減少額外的工具類的數量,但顯然不是最需要的特性。還有一些其他的新增功能,我希望去說的更詳細一些,因此不在本文的范圍內。
對我來說最有趣的事 —— Java 8 流(Streams) —— 在當前的預覽版中不可用。我們可以發現事實上它剛被merge到AOSP源碼,所以期望可以在下個N Preview 或者 Beta release中見到它。如果你實在等不及去瀏覽 —— 可以試試使用 Lightweight-Stream-API,目前的一個開源向后兼容。
總結
在這篇文章中,我們了解了Java 8的用例,以及目前其在Android N Preview SDK的實現情況。我們也看到了當前Jack編譯器的限制,及其在***發布前可能被修復的功能。