在 Android 項目中使用 Java8

轉載請註明出處:zhuanlan.zhihu.com/p/23279894html


前言

在過去的文章中我介紹過Java8的一些新特性,包括:java

  1. Java8新特性第1章(Lambda表達式)
  2. Java8新特性第2章(接口默認方法)
  3. Java8新特性第3章(Stream API)

以前因爲Android平臺不支持Java8,若是咱們想在Android項目中使用Lambda表達式、Stream API等Java8中的新特性就必須使用Retrolambda、Lightweight-Stream-API等第三方開源庫來實現。如今Google爸爸終於讓Android平臺支持Java8了,這篇文章中便來和你們聊聊如何在Android項目中配置使用Java8。android

遺憾的是目前Android平臺僅支持Java8的部分新特性,當咱們在開發面向Android N及以上版本的應用時(即minSdkVersion>=24),能夠使用以下新特性:git

簡單的說就是如今你的項目要想使用Stream API、接口默認方法和重複註解就要求你的minSdkVersion>=24,而Lambda表達式和方法引用則對minSdkVersion無要求。關於這些新特的使用及分析能夠看看我以前的文章。github

Jack(Java Android Compiler Kit)

要想在Android項目中使用Java8的新特性,須要將你的Android Studio升級到2.1及以上版本,並採用新的Jack(Java Android Compiler Kit)編譯。新的 Android 工具鏈將 Java 源語言編譯成 Android 可讀取的 Dalvik 可執行文件字節碼,且有其本身的 .jack 庫格式,在一個工具中提供了大多數工具鏈功能:從新打包、壓縮、模糊化以及 Dalvik 可執行文件分包。express

如下是構建 Android Dalvik 可執行文件可用的兩種工具鏈的對比:oracle

  • 舊版 javac 工具鏈:
    javac (.java --> .class) --> dx (.class --> .dex)
  • 新版 Jack 工具鏈:
    Jack (.java --> .jack --> .dex)

配置

爲了在項目中使用Java8,咱們還須要項目module中的gradle.build文件中加入以下代碼:app

android {

  compileSdkVersion 24
  buildToolsVersion "24.0.3"

  defaultConfig {

    applicationId "me.baron.hellojava8"
    minSdkVersion 24
    targetSdkVersion 24
    versionCode 1
    versionName "1.0"

    jackOptions {
      enabled true
    }
  }

  compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
  }
}複製代碼

使用

進行上述配置後你們就能夠在Android項目中盡情的探索使用Java8的新特性了。好比以前咱們實現button的點擊事件時須要這這樣寫:ide

button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        v.setText("lalala");
       }
});複製代碼

如今咱們即可以使用Java8的Lambda表達式來實現了:工具

button.setOnClickListener(v -> v.setText("lalala"));複製代碼

若是你項目的minSdkVersion>=24,咱們還能夠使用Stream API。比方說有一個形狀集合shapes,如今咱們想把全部藍色的形狀提取到新的List裏。經過Stream API則能夠很輕易的辦到:

List<Shape> blue = shapes.stream()
                          .filter(s -> s.getColor() == BLUE)
                          .collect(Collectors.toList());複製代碼

總結

Java8的新特性並非本文的重點,對此有興趣的同窗能夠去翻看我以前的文章。當前Jack編譯器還有諸多限制,好比在使用新的Jack工具鏈時會禁用Instant Run以及前面提到的新特性對咱們的最低支持版本和編譯版本有要求等等(我猜測Jack對Buck、Layoutcast、Freeline等編譯方案也會有影響,沒作過驗證,有了解的同窗能夠在評論區留言和你們交流下);總之要想在Android項目中愉快的使用Java8所有的新特性還需時日。期待Google爸爸儘快優化吧!

參考資料:


若是你們喜歡這一系列的文章,歡迎關注個人知乎專欄、GitHub、簡書博客。

相關文章
相關標籤/搜索