在 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、简书博客。

相关文章
相关标签/搜索