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

转载请标明出处: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 表达式

你可能感兴趣的:(lambda)