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