资讯专栏INFORMATION COLUMN

在Android项目中使用Java8

junnplus / 1949人阅读

摘要:现在爸爸终于让平台支持了,这篇文章中便来和大家聊聊如何在项目中配置使用。要想在项目中使用的新特性,需要将你的升级到及以上版本,并采用新的编译。

转载请注明出处:https://zhuanlan.zhihu.com/p/23279894

前言

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

Java8新特性第1章(Lambda表达式)

Java8新特性第2章(接口默认方法)

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 工具链:
javac (.java --> .class) --> dx (.class --> .dex)

新版 Jack 工具链:
Jack (.java --> .jack --> .dex)

配置

为了在项目中使用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 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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/66518.html

相关文章

  • 好文章必读 - 收藏集 - 掘金

    摘要:方法即为收集器,它接收高阶函数和的后端掘金年的第一天,我坐在独墅湖边,写下这篇文章。正因如此,所以最全系列教程后端掘金是从版本开始引入的一个新的,可以替代标准的。 设计模式之单例模式 - 掘金前言 作为一个好学习的程序开发者,应该会去学习优秀的开源框架,当然学习的过程中不免会去阅读源码,这也是一个优秀程序员的必备素养,在学习的过程中很多人会遇到的障碍,那就是设计模式。很多优秀的框架会运...

    FrozenMap 评论0 收藏0

发表评论

0条评论

junnplus

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<