0%

在Android Studio中使用Lambda表达式

Lambda 表达式是 Java 8 的新特性之一,本文主要介绍如何让 Android 项目集成 Labmda 表达式功能。

已知的集成方式有两种:

  1. 使用官方的 Jack 工具链 启用Java 8 功能
  2. 使用第三方库 Retrolambda 启用 Java 8功能

在本人使用过程中发现,通过 Jack 集成的方式,存在一些问题(不仅仅是官方声明的问题),所以在这里 推荐使用 Retrolambda 来集成 Lambda 功能。

2017-06-05 更新: 通过在不同的SDK版本上测试发现,Android M (api 23)以下版本中,不论是 Jack 还是 Retrolambda 的集成方式均会偶现 NoClassDefFoundError,并都没有成型的解决方案,所以以下诸君看看便可,不太能付诸实际项目中~ :(

官方Jack集成

在模块级别的 build.gradle 中配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
android {
...
defaultConfig {
...
jackOptions { // 开启 Jack
enabled true
}
}
compileOptions { // 使用 Java 8 进行编译
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}

当然你首先得有 JDK 8 的开发环境。

第三方Retrolambda集成

因为 Android Studio 使用 Gradle 作为构建工具,所以我们需要在集成 gradle-retrolambda Gradle 插件:

  1. 下载安装 JDK 8

  2. 在项目级别(项目根目录)的 build.gradle 中加入:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    buildscript {
    repositories {
    ...
    mavenCentral() // 加入 mavenCentral
    }
    dependencies {
    ...
    classpath 'me.tatarka:gradle-retrolambda:3.6.1' // 将retrolambda加入classpath
    }
    }
    allProjects {
    repositories {
    ...
    mavenCentral() // 加入 mavenCentral
    }
    }
  3. 在模块级别的 build.gradle 中加入:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    apply plugin: 'com.android.application'
    apply plugin: 'me.tatarka.retrolambda' // 引入 retrolambda 插件
    android {
    ...
    compileOptions { // 使用 Java 8 进行编译
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
    }
    }
  4. 在混淆文件中加入

    1
    2
    -dontwarn java.lang.invoke.*
    -dontwarn **$$Lambda$*

之后就可以愉快的使用 Lambda 表达式啦~