Android中使用lambda表达式

lambda 语法简介

视频为本篇播客知识点讲解,建议采用超清模式观看, 欢迎点击订阅我的优酷

如果刚学Android,不知道怎么写点击事件可以跳转,传送门

要想在Android中使用lambda语法,首先我们需要了解下lambda语法是什么?
lambda语法是java8的新特性,能够大量减少匿名内部类那种冗余的代码。

我们先来看看老版的java代码,比如排列字符串:

List<String> names = Arrays.asList("peter", "anna", "mike", "xenia");
Collections.sort(names, new Comparator<String>() {
    @Override
    public int compare(String a, String b) {
        return b.compareTo(a);
    }
});

只需要给静态方法 Collections.sort 传入一个List对象以及一个比较器来按指定顺序排列。通常做法都是创建一个匿名的比较器对象然后将其传递给sort方法。

在Java 8 中你就没必要使用这种传统的匿名对象的方式了,Java 8提供了更简洁的语法,lambda表达式:

Collections.sort(names, (String a, String b) -> {
    return b.compareTo(a);
});

看到了吧,代码变得更段且更具有可读性,但是实际上还可以写得更短,
对于函数体只有一行代码的,你可以去掉大括号{}以及return关键字:

Collections.sort(names, (String a, String b) -> b.compareTo(a));

起始你还可以挑战下lambada的极限,还可以写得更短点:

Collections.sort(names, (a, b) -> b.compareTo(a));

当然lambda语法还有好多新特性,
比如我们可以直接在lambda表达式中访问外层的局部变量:

    public void method(){
        String i="i";
        button.setOnClickListener(v->{
            Log.i("lambda",i); // 不报错
            // i="a"; // 编译报错
        });
    }

和之前不同的是,这里的变量i可以不用声明为final,不过这里的i必须不可被后面的代码修改(即隐性的具有final的语义)

Android中使用lambda表达式

我们刚刚简单介绍了java8的新特性lambda,接下来我们就来看看怎么在Android中使用lambda。

由于lambda是java8新特性,所以请确保你的电脑里面有jdk8,然后记得Android Studio中配置jdk环境

Android中使用lambda表达式

注意,后面的才是重点, 因为google公司和oracle公司一直在打官司,所以Android默认是不支持java8的,如果你直接在代码中使用lambda语法,编译的时候就会提示“lambda expression are not supported at this language level”。

虽然不能直接使用,但是Android Studio这个工具相当棒,我们可以通过集成插件的形式使用,github地址

步骤1:
我们需要首先在项目根目录的build.gradle文件中添加依赖 “me.tatarka:gradle-retrolambda:3.2.0”

    dependencies {
        classpath 'com.android.tools.build:gradle:1.3.0'
        classpath 'me.tatarka:gradle-retrolambda:3.2.0'
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }

步骤2
在module目录下的build.gradle文件中应用插件

apply plugin: 'com.android.application'
apply plugin: 'me.tatarka.retrolambda'

步骤3
在module目录下build.gradle文件中的android节点下还需要表明使用jdk8,需要做如下配置:

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

配置完以后,预览下module目录下的build.gradle

apply plugin: 'com.android.application'
apply plugin: 'me.tatarka.retrolambda'
android {
    compileSdkVersion 23
    buildToolsVersion "23.0.1"

    defaultConfig {
        applicationId "com.demo.myapplication"
        minSdkVersion 14
        targetSdkVersion 22
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:23.0.1'
}

经过上面3步,我们就可以在Android中使用lambda语法了,来看看效果:
Android中使用lambda表达式

当我们直接使用匿名内部类的时候,自动就提示我们lambda语法了。