四個庫,讓你在 Android 中啟用 Java 8 功能

發表於2016-12-09

Java 8 的推出引入很多革命性變化,加入了函數語言程式設計的特徵,使基於行為的程式設計成為可能,同時簡化了各種設計模式的實現方式,是 Java 有史以來最重要的更新。

自 Android N 之後,由於 Jack&Jill 編譯工具鏈的存在,Java 8 的一些語言功能終於得到了支援。雖然還存在一些限制,如,新編譯器附帶的資料繫結支援庫無法使用,以及註釋支援受限等,但這完全不足以否定 Java 8 中存在的其他先進功能。在這篇文章中,作者介紹了在 Android 中引入 Java 8 功能的四個庫,希望它們對你有幫助。

Java 8 在 Android M(6.0)及更低版本中的功能

Java 8 的釋出引入了一些新特性。在所有功能中較為重要的有 lambda 表示式,方法引用,Stream API 和新的時間日期 API。

目前,Jack&Jill 編譯工具鏈還處於早期開發階段,它比較容易與 Java 7 保持同步。另外,很幸運的是,現在有幾款庫還能將 Android 中 的 Java 8 移植到更低版本的編譯器中。讓我們來看看它們是如何發揮作用的。

Lambda 表示式

伴隨 Java 8 的釋出而釋出的 lambda 表示式,允許你使用引數傳遞程式碼塊。它們可以用於代替類的匿名例項,例如,對單擊按鈕時執行的操作進行定義。下面我演示了使用匿名類和 lambda 表示式在按鈕上設定 onClick 監聽器:

如果想了解有關 lambda 表示式的更多資訊,可以參閱 Java 8 中的 Lambda 表示式Android 中的 Lambda 表示式

用 Retrolambda 實現 Java 6 和 7 中的 Lambda 表示式功能

使用 Retrolambda 能很快實現 Java 6 和 Java 7中的Lambda 表示式功能,將它應用在 Android 上也是一樣。Retrolambda 能轉換 Java 8 編譯的位元組碼,以便它在更低版本的 Java 中執行此程式碼,而不需要任何附加的依賴關係。

要在 Android Studio 專案中使用 retrolambda,需要將下列程式碼新增到專案級別的 build.gradle 檔案中:

模組級 build.gradle 檔案應包含以下突出顯示的程式碼行:

遵循以上步驟,你已經能夠成功地在 Android上啟用 Java 8 的其中一項功能。

方法引用(Method References)

方法引用可以很方便地與 lambda 表示式一起使用,以簡化語法。例如,如果一個 lambda 表示式主體包含一個類方法呼叫,它可以替換為一個方法引用:

引數會自動提供以匹配方法簽名(method signature)。

這裡存在三種::運算子用法:

  • object::instanceMethod
  • Class::staticMethod
  • Class::instanceMethod

你可點選此處瞭解更多有關方法引用和建構函式引用的資訊。

如果你已經使用 retrolambda 庫啟用了 lambda 表示式,方法引用此時也能正常執行,因為此功能是包含在內的。如果沒有,請你參考上一節的內容。

Stream API

Java 8 另一個了不起的語言特性就是 Stream API,Stream 表示抽象層,允許開發人員以宣告方式處理底層資料。它的另一個好處就是能對 Stream 採取並行執行操作,這有利於開發人員有效地處理大量資料,而不必為併發和執行緒管理擔心。

例如,我們有一個數字列表,需要過濾出小於 10 的數字,然後返回其餘的排序列表。使用 Stream API,事程式碼表現更美觀:

這僅是 Stream API 提供的一個簡單示例。 有關 Java 中的 Stream 的更多資訊,請參閱 Java 8 中的 Stream API

在 Android 中,我們有兩個庫,可以從 Stream API 中選擇,我們來看下:

Lightweight-Stream-API

Lightweight-Stream-API 庫將 Stream API 反向執行到 Java 7,並通過使用迭代器重寫 API 來降低版本。該庫在原始 Java 8 實現中提供了許多 Stream 操作符,其中有一些是新的,如:sortBy,groupBy,chunkBy,sample,slidingWindow 等。

將庫包含到 Android 專案中是為了給 build.gradle 檔案中的依賴項新增單獨的一行:

由於該庫已經重新實現 Stream API 的方式,一些語法會與原始的 Stream 實現不同,並且並行執行也被省略。 更多資訊,請參閱 Github 上的庫頁面

streamsupport

第二個將 Stream API 從 Java 8 回退到更低版本的庫就是 streamsupport 庫。與 Lighweight-Stream-API 相比,streamsupport 除了具有並行執行功能和 Java 9 的增強功能外,還有一些其他的功能,如,Java 8 的功能介面或可選模式。

為了在您的專案中使用 streamsupport 庫,請將以下依賴項新增到 build.gradle 檔案中:

更多資訊,請參閱 Github 上的 streamsupport 庫

新時間日期 API

Java 8 之前的版本不太支援日期和時間的設定。雖然也有幾個支援的 API,但它們各自都存在問題。為解決這些問題,Java 8 帶來了新時間日期,你可以點選此處瞭解更多相關資訊。

ThreeTen Android Backport

雖然 Android 不支援 Java 8 中的時間日期 API,但一個名為 ThreeTen Android Backport 的庫可以提供相同的功能。

使用之前,請將以下行新增到 build.gradle 檔案中:

結論

在這篇文章中,我介紹了在 Android 中引入 Java 8 功能的四個庫。 使用這些庫,您可以在 Android 中使用 lambda 表示式,方法引用,Stream API 或新日期時間 API,而無需遷移到新的 Jack&Jill 編譯器工具鏈,同時還能保持與以前版本的 Android 和 Java 的相容性。

本文翻譯自 Milan Bárta 的 Enable Java 8 features in Android with these libraries

相關文章