现在android开发最多只支持到java7,这导致我们无法在android上使用java8中的lambda。不过我们可以借助第三方插件来帮助我们实现,这就是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
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~