Android Lambda表达式

来源:互联网 发布:c语言编译器安卓 编辑:程序博客网 时间:2024/06/03 12:03

Lambda表达式是JAVA8新加入的特性。目的是让代码更少,同时减少我们的工作量。当我们打开一个新的.java文件时会看到编译器自动将某些代码变成了Lambda表达式的形式,那么可以想象成Google更推荐大家使用Lambda表达式进行JAVA代码的书写。那么之前一直是看,能看懂但是没有真正的去使用,今天就完整的给大家写一个如何使用Lambda表达式的帖子,希望大家可以一起学习,一起进步,写出逼格更高,更易读的代码。(Lambda表达式对我们是Rx有很大的帮助)

首先我们看到了Lambda表达式在我们的项目中出现,一点可以展开,这个时候还不是真的Lambda表达式!这个时候只是显示出来而已!当我们真的使用Lambda表达式的时候是需要对我们的项目进行配置的。

第一步加入Lambda表达式插件 在项目的gradle文件中

apply plugin: 'me.tatarka.retrolambda'

android{    ...    compileOptions {        sourceCompatibility JavaVersion.VERSION_1_8        targetCompatibility JavaVersion.VERSION_1_8    }}

第二步在项目的app/gradle 文件中加入

 dependencies {        ...        classpath 'me.tatarka:gradle-retrolambda:3.2.5'    }

做好了这两步的准备工作之后,我们就可以在我们的项目里面使用Lambda表达式了。

例1、用lambda表达式实现Runnable
使用lambda表达式替换匿名类,而实现Runnable接口是匿名类的最好示例。

使用之前:

new Thread(new Runnable() {    @Override    public void run() {    System.out.println("Before Java8, too much code for too little to do");    }}).start();

使用之后

new Thread( () -> System.out.println("Use Lambda , Inner class so easy!") ).start();

那么你可能会问当我们的匿名内部类要是有参数怎么办,别急,我们可以使用(以View举例)

mView.setOnClickListener((View v)->{   });

来实现参数的传递。而多参数的时候可以写成(int p1,int p2,….)->{} 只需要将调用的匿名内部类的方法参数写上就可以了。

例2、使用lambda表达式对列表进行迭代
使用之前

List features = Arrays.asList("Lambdas", "Default Method", "Stream API", "Date and Time API");for (String feature : features) {    System.out.println(feature);}

使用之后 这里的n是我们放到ArrayList中的对象!

List features = Arrays.asList("Lambdas", "Default Method", "Stream API", "Date and Time API");features.forEach(n -> System.out.println(n));

但是此方法虽然很好用,但是对版本有限制要求。目前在低版本的android中尚未解决。

最后就是很多的Rxjava中的链式结构存在着大量的内部类,这个时候我们使用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);        }    });

使用后

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));

最后总结目前Lambda表达式在Android中的使用主要是针对内部类的简化!至于其他的使用并不是特别的突出。

原创粉丝点击