在Android项目中使用Java8
来源:互联网 发布:中日关系未来走向 知乎 编辑:程序博客网 时间:2024/06/10 21:00
前言
在过去的文章中我介绍过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<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 上添个 Star 吧!
- 知乎专栏:https://zhuanlan.zhihu.com/baron
- GitHub:https://github.com/BaronZ88
- 在Android项目中使用Java8
- 如何在 Android 中使用 Java8
- 在老项目中使用java8的日期
- 如何在Android studio中使用java8 的Lambda表达式
- Android N中使用Java8
- 如何在原来的项目中使用java8的时间api
- java8 语言新功能在Android 中的使用
- Java8 Lamdba 在Android Studio 使用
- 如何在eclipse中使用java8编译
- Android中使用Java8 新增语言功能
- 在Android项目中使用 OpenCV 入门
- android在项目中使用百度地图
- 在Android项目中使用FCM(FirebaeCloudMessage)
- eclipse中使用java8
- Java8中使用APT
- eclipse中使用java8
- 如何在Android Studio使用Java8 Lambda表达式
- 在Java8的foreach()中使用return/break/continue
- js中使用正则表达式,简单查找字母和数字
- Python系列之三_循环语句
- lua 打印函数调用堆栈
- MySQL与SQL Server的一些区别浅析
- Shell 基本运算符
- 在Android项目中使用Java8
- leetcode题解-451. Sort Characters By Frequency
- 网易编程题:连续字符转换
- PAT A1107 social clusters (30)
- poj 1064 Cable master(二分+贪心+分数化整数)
- 1007最大连续子集
- vim编辑器
- 多线程编程笔记
- cocos2d js接入有米广告-ios版本