什么是Lambda表达式

以下是构建 Android Dalvik 可执行文件可用的两种工具链的对比:

旧版 javac 工具链:
javac (.java --> .class) --> dx (.class --> .dex)
新版 Jack 工具链:
Jack (.java --> .jack --> .dex)
配置 Gradle
如需为您的项目启用 Java 8 语言功能和 Jack,请在模块层级的 build.gradle 文件中输入以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
android {
...
defaultConfig {
...
jackOptions {
enabled true
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}

已知问题
Instant Run 目前不能用于 Jack,在使用新的工具链时将被禁用。

方式二:使用第三方Java8兼容插件

下面是插件的ReadMe的配置:添加下面的内容到项目的build.gradle文件中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
buildscript {
repositories {
mavenCentral()
} dependencies {
classpath 'me.tatarka:gradle-retrolambda:3.2.5'
}
} // Required because retrolambda is on maven central
repositories {
mavenCentral()
} apply plugin: 'com.android.application' //or apply plugin: 'java'
apply plugin: 'me.tatarka.retrolambda'

在本人的项目中,是如下配置,可以避免很多不必要的错误:

build.gradle文件在项目根目录有一个,在Module下也有一个:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.1.2'
classpath 'me.tatarka:gradle-retrolambda:3.2.5'
classpath 'me.tatarka.retrolambda.projectlombok:lombok.ast:0.2.3.a2'
}
configurations.classpath.exclude group: 'com.android.tools.external.lombok'
} allprojects {
repositories {
jcenter()
}
}
1
2
3
4
5
6
7
8
9
10
apply plugin: 'com.android.application'
apply plugin: 'me.tatarka.retrolambda' android {
...
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}

可以看到我在使用中多了几个配置,不过都是在这个插件的issue里查到的。建议仔细阅读下配置说明 ,可以适应一些实际项目中的一些特别需求。

常见Error及解决方式

Couldnot find property ‘options’ on task ‘:app:compileDebugJavaWithJack’.

原因:使用Google官方的方式有一定的兼容性,使用Jack时不能同时使用APT,如果使用butterknife、Dagger等使用了APT的注解框架就不行了

解决方案:使用retrolambda的兼容插件的方式启用lambda

Doesn’t seem to correctly use modified lombok version

原因参见这里

解决方案:按照我上面写的就不会出现这个问题了。

总结

对于想尝鲜的的开发者,启用Lamdba是个不错的选择,毕竟这个东西会慢慢普及的。下面是一些为想了解更多Lamdba使用方法的朋友搜集的资料以及本文参考的文章:

05-01 06:17