Lambda表达式是Java 8中的一个重要新特性,使用Lambda表达式可以简化很多代码,比如常见的为一个按键添加点击事件Listener
的代码:
1 | btn.setOnClickListener(new View.OnClickListener() { |
其中有用的代码很有可能只有一行,其他部分其实都没有实际意义,只是语法需要,创建了一个匿名类而已。但是,如果使用Lambda表达式之后,上述代码就可以简化为:
1 | btn.setOnClickListener(v -> { |
如果只有一行代码还可以进一步简化为:
1 | btn.setOnClickListener(v -> doSomething()); |
可以看到,使用了Lambda表达式后可以让程序代码更加优雅简洁。关于Java 8中的Lambda表达式详情,可参考以下几篇文章:
然而遗憾的是,Android Studio中的Java版本被限制在了Java 1.7以下,与系统中安装的JDK版本无关,也就是就算安装了JDK 1.8也无法使用Java 8的新特性。不过我们依然可以通过一些方法来使用Lambda表达式的,主要方法有两种,下面将分别介绍。
RetroLambda
RetroLambda是一个Gradle插件,用于实现让低版本的Java(Java 1.7、1.6、1.5等)支持Lambda表达式。做所周知,Android Studio使用的就是Gradle,Gradle Retrolambda插件的官方Github网站及使用说明见这里。在Android Studio中的使用步骤如下:
1.安装JDK 8。
2.在项目的build.gradle
文件中添加以下代码:
1 | buildscript { |
3.在工程模块的build.gradle
文件中添加以下代码:
1 | apply plugin: 'me.tatarka.retrolambda' |
4.在proguard-rules.pro
文件中添加以下代码:
1 | # For retrolambda |
5.还可以对Retrolambda进行一些配置,具体见Github页面的说明
注意事项:
retrolambda的版本这里选择了3.3.0,这是目前的最新版本,不过之后肯定会有新版本的,可以根据Github上的说明替换为最新版本。
配置完成后第一次编译时,Android Studio中的Gradle不能配置为Offline模式,否则会提示错误:
1 | Gradle sync failed: No cached version of me.tatarka:gradle-retrolambda:3.3.0 available for offline mode. |
因为上述配置只是指明了需要使用me.tatarka:gradle-retrolambda:3.3.0
,此时还需要联网下载retrolambda,若配置为离线模式是无法正常下载的。不过只要编译成功一次之后,retrolambda就会被下载到缓存中,此时就可以了改回Offline模式了。
Jack
Jack是Java Android Compile Kit的缩写,它是Google为Android推出的一个全新的Java编译工具链。关于Jack的详细信息可参考以下链接:
使用Jack也是Google官方给出的支持Java 8特性的方法:Java 8 语言功能
要在Android Studio中使用Jack并开启Java 8,只需要在工程模块的build.gradle
文件中添加以下代码:
1 | android { |
使用Jack后,除了支持Lambda表达式外,还可以支持更多的Java 8新特性。不过实际测试下来,使用Jack有两个很大的缺陷:
首先,Jack的编译速度明显要慢很多,而且似乎每次都要从头全部重新编译一次,同样的工程编译所需的时间是原来的5~10倍;
其次,使用Jack后就无法使用Instant Run功能了,Instant Run是一个很好用的功能,在修改程序后重新推送到设备运行时不需要再次安装apk文件,基本马上就可以看到更改后的变化,这可以大幅提升工作效率。然而目前版本的Jack并没有支持Instant Run。
考虑到Jack这两个缺陷实在会严重降低工作效率,在目前看来使用Jack还不是一个很好的选择。如果要使用Lambda表达式,RetroLambda是一个更好的选择。