什么是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使用方法的朋友搜集的资料以及本文参考的文章: