3分钟搞定 Android Lambda表达式

一、Lambda介绍

Lambda表达式是Java8新加入的特性。目的是让我们初始化接口类型对象时代码更加精简!

所以他的出现就是定义不同类型的接口对象如何精简化声明。

如果只是想使代码更精简,按照下面的模版写就可以了,后面的部分可以不看。

//只能用于单方法接口
Lambda公式:(param1,param2)->{  method body   }

其中 (params) 是方法的参数数量,有几个写几个;->{ method body } 声明方法体,里面写逻辑。

二、Lambda的使用限制

这里需要先声明一下他的限制条件:接口内只有一个方法

无论是我们声明两个参数一样的方法:
在这里插入图片描述
还是声明两个参数不同的方法:
在这里插入图片描述
在语法上都会报错。

好了说完了限定条件,我们需要掌握的知识就明确了。

Lambda主要解决的就是单方法接口的简化。

当我们打开一个新的.java文件时会看到编译器自动将某些代码变成了Lambda表达式的形式,那么可以想象成Google更推荐大家使用Lambda表达式进行Java代码的书写。

三、无参数接口初始化

例1、用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();

即直接通过"()->{ method body }"声明方法体。

注1:如果方法体的方法只有一行,那么花扣号也可以省略,如上面的例子。

四、单参数接口初始化

public class LambdaDemo {

    public LambdaDemo() {
        setInterface1(it -> {
        });

        setInterface1((String it)-> {
        });
    }

    public void setInterface1(Interface1 interface1) { }

    interface Interface1 {
        public void method1(String params);
    }

}

这里我们可以直接定义变量名it,然后通过“->{ method body }” 方式声明方法体。
it为方法参数可以自定义名称。

也可以使用“(String it)->{ method body }”即在扣号内声明参数的类型的方式来声明方法体。

五、多参数接口初始化

在这里插入图片描述
多参数时我们可以使用"(it1,it2)->{ method body }"的形式定义接口,如果参数增加只需要在括号内增加变量即可,如三个参数可以是“(it1,it2,it3)”,名称可以自定义。

也可以使用“(String it1,int it2)-> { method body }”的形式定义,这里只是明确了变量参数。

最后扣号的规则是,要么都有类型声明,要么都没有类型声明,如第三个设置方法的写法会报错。

六、返回对象时的使用

在这里插入图片描述
从上面可以看出Lambda主要是优化了"new Interface()"对象的语法!

七、如何在Android中使用

由于Lambda是Java8引入的新特性,所以我们需要在module的gradle文件中加入Java版本限定:

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

加入限定后,我们就可以在我们的项目里面使用Lambda表达式了。

八、结合RxJava

最后就是很多的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));
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值