在Android上使用Lambda表达式 - retrolambda插件

来源:互联网 发布:美国中文导航软件 编辑:程序博客网 时间:2024/06/03 18:47

转载请标明出处: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。所以这里我们直接选第一个进行配置。

gradle-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}
  • Step4

在根目录下的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"}
  • Step5

项目默认是依赖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')}
  • Step6
    执行Gradle Sync Project,稍等AS下载好相关插件及依赖库,就可以开始写Lambda表达式了。

强烈建议你,有空去看看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 表达式

1 0
原创粉丝点击