如何在 Android 编程中使用 Lambda 表达式

在 Java8 之前,Java 并不支持 Lambda 表达式,而 Android 目前最新也才支持到 Java7 特性,所以在 Android 中使用 Lambda 表达式需要进行一些处理,将 Lambda 表达式编译成 Android 可以“理解”的方式。

Retrolambda 是一个能够让我们在 Java7 中使用 Lambda 的工具,再通过 gradle-retrolambda 插件,在 gradle 编译过程中将会:

  1. 将 Java8 中的 javac 编译 Java8 的代码;
  2. 将产生的 Java8 的字节码转换为 Java6 的字节码;
  3. 重新打包 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<String, Integer>() {
    @Override
    public Integer call(String s) {
        return s.length();
    }
});

可以写作:

strings.map((String s) -> {
    return s.length();
});

至于详细的 bytecode 转换过程,有兴趣的同志们可以自己研究研究。

发表评论

电子邮件地址不会被公开。 必填项已用*标注