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