在Java8之前,Java并不支持Lambda表达式,而Android目前最新也才支持到Java7特性,所以在Android中使用Lambda表达式需要进行一些处理,将Lambda表达式编译成Android可以“理解”的方式。
Retrolambda是一个能够让我们在Java7中使用Lambda的工具,再通过gradle-retrolambda插件,在gradle编译过程中将会:
将Java8中的 javac编译 Java8的代码;
将产生的Java8的字节码转换为Java6的字节码;
重新打包class。
build.gradle配置文件如下:
buildscript {
repositories {
mavenCentral()
maven {
url "https://oss.sonatype.org/content/repositories/snapshots"
}
}
dependencies {
classpath 'me.tatarka:gradle-retrolambda:1.2.+'
}
}
// Required because retrolambda is on maven central
repositories {
mavenCentral()
}
apply plugin: 'android'
apply plugin: 'retrolambda'
也可以添加如下设置:
retrolambda {
jdk System.getenv("JAVA8_HOME")
javaVersion JavaVersion.VERSION_1_6
}
android {
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
从此以后,
strings.map(new Func1
@Override
public Integer call(String s) {
return s.length();
}
});
可以写作:
strings.map((String s) -> {
return s.length();
});
至于详细的bytecode转换过程,有兴趣的同志们可以自己研究研究。
Android暂时还不能用,如果在Androidstudio中使用的话,会有提示“lambdaexpressionarenotsupportedatthislanguagelevel”。因为lambda是在java8引进的。