天天看點

在Android項目中使用Java8

在Android項目中使用Java8

前言

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

  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平台僅支援Java8的部分新特性,當我們在開發面向Android N及以上版本的應用時(即minSdkVersion>=24),可以使用如下新特性:

  • Lambda表達式(Lambda Expressions)(也可以在minSdkVersion<24的情況下使用)
  • 方法引用(Method References)(也可以在minSdkVersion<24的情況下使用)
  • Stream API(Streams)
  • 接口預設方法(Default Methods)
  • 重複注解(Repeating Annotations)

簡單的說就是現在你的項目要想使用Stream API、接口預設方法和重複注解就要求你的minSdkVersion>=24,而Lambda表達式和方法引用則對minSdkVersion無要求。關于這些新特的使用及分析可以看看我之前的文章。

Jack(Java Android Compiler Kit)

要想在Android項目中使用Java8的新特性,需要将你的Android Studio更新到2.1及以上版本,并采用新的Jack(Java Android Compiler Kit)編譯。新的 Android 工具鍊将 Java 源語言編譯成 Android 可讀取的 Dalvik 可執行檔案位元組碼,且有其自己的 .jack 庫格式,在一個工具中提供了大多數工具鍊功能:重新打包、壓縮、模糊化以及 Dalvik 可執行檔案分包。

以下是建構 Android Dalvik 可執行檔案可用的兩種工具鍊的對比:

* 舊版 javac 工具鍊:  
  <font color="ff0000"> `javac (.java --> .class) --> dx (.class --> .dex)` </font>
* 新版 Jack 工具鍊:  
  <font color="ff0000"> `Jack (.java --> .jack --> .dex)` </font>           

複制

配置

為了在項目中使用Java8,我們還需要項目module中的gradle.build檔案中加入如下代碼:

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的點選事件時需要這這樣寫:

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爸爸盡快優化吧!

參考資料:

  • https://developer.android.com/guide/platform/j8-jack.html
  • https://medium.com/@sergii/java-8-in-android-n-preview-76184e2ab7ad
如果大家喜歡這一系列的文章,歡迎關注我的知乎專欄和GitHub。
  • 知乎專欄:https://zhuanlan.zhihu.com/baron
  • GitHub:https://github.com/BaronZ88