如何配置 lambda?
//在 app/build.gradle
android {
compileSdkVersion 26
defaultConfig { }
buildTypes { }
compileOptions {
targetCompatibility 1.8
sourceCompatibility 1.8
}
}
RxJava 配合 lambda,代碼看起來會簡潔很多,也更加容易看懂,當(dāng)然前提是要會 lambda妹窖,所以本章介紹一下lambda 的基礎(chǔ)用法,其實也很簡單收叶,看幾個例子就可以了骄呼。
lambda的使用前提是某個內(nèi)部類、匿名內(nèi)部類只有一個方法,例如以下幾個類:
interface InnerZeroParamReturnClass {
Object opr();
}
interface InnerZeroParamClass {
void opr();
}
interface InnerOneParamClass {
void opr(int a);
}
interface InnerTwoParamClass {
void opr(int a, int b);
}
我們再添加幾個方法谒麦,參數(shù)分別為上述幾個接口對象
public void opr0(InnerZeroParamClass opr) {}
public void opr01(InnerZeroParamReturnClass opr) {}
public void opr1(InnerOneParamClass opr) {}
public void opr2(InnerTwoParamClass opr) {}
lambda 例子介紹
下面通過舉幾個例子來介紹最基礎(chǔ)的lambda 最基礎(chǔ)的語法俄讹,例子間的順序為逐漸深入,每個例子在前面的例子的基礎(chǔ)上在介紹一個新的特點
- 基本語法
(v1, v2) -> {}
绕德,我們以opr2
方法為例子
opr2((a, b) -> {
int sum = a + b;
System.out.println(sum);
});
- 如果參數(shù)只有一個患膛,則可以省略箭頭左側(cè)的圓弧括號
opr1(a -> {
int square = a * a;
System.out.println(square);
});
- 如果沒有參數(shù),則需要一對圓弧括號
opr0(() -> {
String result = "no param";
System.out.println(result);
});
- 如果匿名內(nèi)部類只有一條語句(不一定是一行耻蛇,可以是鏈?zhǔn)?踪蹬,那么可以省略大括號
opr1(v ->
System.out.println("")
;
//這個例子還屬于第2種語法情況
- 如果匿名內(nèi)部類的方法體只有一個語句,且參數(shù)A是相同的臣咖,那么可以用雙冒號寫法跃捣,即去掉
(v1, v2) ->
以及方法的(param)
部分,方法調(diào)用.
改成方法引用::
夺蛇,如下
opr1(A ->
System.out.println(A)
;疚漆,
//上面滿足條件1.方法體只有一個語句;2該語句方法的參數(shù)和'->'左側(cè)的參數(shù)是同一個變量
//所以可以變成簡寫成下面這種寫法
opr1(System.out::println); //println 是 out 的靜態(tài)方法刁赦,同樣的如果是調(diào)用成員方法娶聘,格式為 obj::method
- 如果匿名內(nèi)部類只有一個返回語句,可以省略 return 關(guān)鍵字
opr01(() -> "Done");
//這個例子還屬于第3, 4種語法情況
以上的六個例子基本涵蓋了lambda的所有語法規(guī)則甚脉,也就是說看懂上面幾個例子后丸升,閱讀和使用 lambda 已經(jīng)不成問題了。本章之所以沒有其它篇幅那么長牺氨,是因為其它長篇幅文章介紹的比較詳細(xì)狡耻,包括新的集合類型的 API 之類的,但是其實新的API使用到的也只是上面的這六種語法猴凹,比如 List 接口的 foreach夷狰,可以用來簡寫遍歷集合的代碼,如下:
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
//for 循環(huán)
for (int num : list) {
System.out.println(num);
}
//lambda
list.forEach(System.out::println);
看到上面的的寫法郊霎,很讓人激動人心孵淘,但點擊去一看這個forEach
,無非就是接收了一個只有一個方法的接口對象歹篓,然后運用上面第5種 lambda 寫法而已,沒什么神奇的揉阎,所以這些新的相關(guān) API的定義并不屬于 lambda 語法范疇庄撮,也就是說 lambda 語法就是這么簡單,大家完全看一會寫一寫就可以在項目中使用毙籽。
我目前不是做純 Java 開發(fā)洞斯,所以用 AS 來支持像 List 的forEach
之類的新 API 會比較麻煩,需要 API 24以上,或者是集成第三方 lambda 支持框架烙如。新API 大多數(shù)情況都可以用相關(guān)操作符替代么抗,代碼量也接近新 API,所以這里就不介紹了亚铁。
所以本章只介紹 lambda 語法蝇刀,不深入其它關(guān)聯(lián)的 API,如果大家對相關(guān)新增的 API 有興趣徘溢,可以看這邊文章哦