Android中使用lambda表达式

来源:互联网 发布:网络匿名性的缺点 编辑:程序博客网 时间:2024/06/05 17:57

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环境

这里写图片描述

注意,后面的才是重点, 因为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语法了,来看看效果:
这里写图片描述

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

1 0