转载请标明出处:http://blog.csdn.net/xx326664162/article/details/53946001 文章出自:薛瑄博客
Java8比较大的一个变化是加入了Lambda表达式,一种紧凑的,传递行为的方式。它可以使你的代码更简洁、逻辑更清晰。特别是用Rxjava的时候,将各种数据变换使用Lambda表达式来简化,可以最大化的减少样板代码,使整个数据流的处理逻辑十分清晰(下面会有个例子)。
retrolambda又是什么呢?它是 Java 5/6/7 中对Java8 Lambda 表达式的非官方兼容方案。因为目前Android的所有版本(除了N Preview),都还不支持java8。
Github上搜索retrolambda,前两个最多星的就是我们的目标了。分别是evant/gradle-retrolambda和orfjackal/retrolambda。他们之间是啥关系呢?简单来说,gradle-retrolambda只是AS的一个gradle插件,他里面也依赖第二个开源库orfjackal/retrolambda。所以这里我们直接选第一个进行配置。
Note: The minimum android gradle plugin is 1.5.0 and the minimum gradle plugin is 2.5.
Step1
下载jdk8(可以与jdk7并存)
Step2
修改系统环境变量,设置好JAVA7_HOME和JAVA8_HOME(为了方便下面插件的配置)
Step3
修改module下的build.gradle文件,加入以下构建脚本即可(详见:README):
apply plugin: 'me.tatarka.retrolambda'
android {
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
//这个节点的内容是可选的
retrolambda {
jdk System.getenv("JAVA8_HOME")
oldJdk System.getenv("JAVA6_HOME")
javaVersion JavaVersion.VERSION_1_6
jvmArgs '-arg1', '-arg2'
defaultMethods false
incremental true
}
在根目录下的build.gradle文件下,添加
可以在evant/gradle-retrolambda或者这里搜索查看最新版本
classpath 'me.tatarka:gradle-retrolambda:3.4.0'
最终整个文件会像这样子:
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.2.3'
classpath 'me.tatarka:gradle-retrolambda:3.2.0'
}
}
allprojects {
repositories {
jcenter()
}
}
alternatively,you can use the new plugin syntax for gradle 2.1+
plugins {
id "me.tatarka.retrolambda" version "3.4.0"
}
项目默认是依赖orfjackal/retrolambdav2.3.0版本的retrolambda库:net.orfjackal.retrolambda:retrolambda:2.3.0
,你可以手动更改此依赖(如修改为最新的版本,如果不想修改可以直接跳过这步):
dependencies {
// Latest one on maven central
retrolambdaConfig 'net.orfjackal.retrolambda:retrolambda:+'
// Or a local version
// retrolambdaConfig files('libs/retrolambda.jar')
}
强烈建议你,有空去看看README
下面是一个简单的例子,分别是加入Lambda表达式前后的对比,大家随意感受一下:
没有使用Lambda表达式:
Observable.from(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10))
.filter(new Func1<Integer, Boolean>() {
@Override
public Boolean call(Integer integer) {
return integer % 2 == 0;
}
})
.map(new Func1<Integer, Integer>() {
@Override
public Integer call(Integer integer) {
return integer * integer;
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<Integer>() {
@Override
public void call(Integer integer) {
System.out.println(integer);
}
});
加入Lambda表达式后:
Observable.from(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10))
.filter(integer -> integer % 2 == 0)
.map(integer -> integer * integer)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(integer -> System.out.println(integer));
参考:在Android上使用Lambda表达式 - retrolambda插件
Android 中使用Lambda表达式
在 Android 中使用 Java 8 lambda 表达式