现在android开发最多只支持到java7,这导致我们无法在android上使用java8中的lambda。不过我们可以借助第三方插件来帮助我们实现,这就是retrolambda
retrolambda
retrolambda可以让lambda表达式、方法引用、try-with-resourcesb语句在java 7,6,5上使用。它通过转化编译后的java8字节码以便在更低的java环境中运行。
retrolambda的使用也有一些限制:
Retrolambda 并不支持java8新api(如Stream类),如果你想使用 java.util.stream下的api,你可以使用第三方库streamsupport
retrolambda对接口中的默认方法和静态方法的实现也是有限制,默认情况下是不支持这两个特性。如果你需要使用也可以的使用的,不过有风险。retrolambda对于存在默认方法和静态方法的接口,会在编译时会额外生成以接口名+ $为名的class文件,默认方法和静态方法全部以静态方法的形式生成在这class文件中,当我们去使用接口类中的默认方法时,实际上是使用接口名+ $类中的静态方法。我测试过程中,发现接口中的默认方法可以使用,但是接口中的静态方法无法使用抛出了
java.lang.VerifyError
的错误。因为retrolambda对这两个特性支持不是很好,因此建议最好不要使用
现在android开发基本上使用gradle来进行构建,插件gradle-retrolambda可以帮助你在android studio中使用Retrolambda
gradle-retrolambda
1.下载java8并安装。
2.在项目中要配置java8 jdk的路径
3.在工程根build.gradle中加入如下:
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'me.tatarka:gradle-retrolambda:3.2.4'
}
}
4.在项目build.gradle中加入如下:
apply plugin: 'me.tatarka.retrolambda'
android {
//others
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
5.加入其他配置(可选)
指定将源码编译的级别,使用下列代码,会将代码编译到兼容1.7的字节码格式(不写默认1.6)
retrolambda {
javaVersion JavaVersion.VERSION_1_7
}
因为现在gradle-retrolambda使用的retrolamdba是2.0.6,如果你想用其他的版本,你可以自行配置
dependencies {
retrolambdaConfig 'net.orfjackal.retrolambda:retrolambda:+'
// Or a local version
// retrolambdaConfig files('libs/retrolambda.jar')
}
混淆可以加入
-dontwarn java.lang.invoke.*
ok现在都配置好了我们就可以尽情的使用Lambda表达式了,赶紧对比下
使用前:
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
System.out.println(v);
}
});
使用后
button.setOnClickListener(System.out::println);
get it~