最簡(jiǎn)單的 Lambda 介紹

如何配置 lambda?
//在 app/build.gradle

android {
    compileSdkVersion 26
    defaultConfig { }
    buildTypes {  }
    compileOptions {
        targetCompatibility 1.8
        sourceCompatibility 1.8
    }
}

RxJava 配合 lambda,代碼看起來(lái)會(huì)簡(jiǎn)潔很多,也更加容易看懂,當(dāng)然前提是要會(huì) lambda,所以本章介紹一下lambda 的基礎(chǔ)用法,其實(shí)也很簡(jiǎn)單,看幾個(gè)例子就可以了。

lambda的使用前提是某個(gè)內(nèi)部類、匿名內(nèi)部類只有一個(gè)方法,例如以下幾個(gè)類:

interface InnerZeroParamReturnClass {
    Object opr();
}

interface InnerZeroParamClass {
    void opr(); 
}

interface InnerOneParamClass {
    void opr(int a);
}

interface InnerTwoParamClass {
    void opr(int a, int b);
}

我們?cè)偬砑訋讉€(gè)方法,參數(shù)分別為上述幾個(gè)接口對(duì)象

public void opr0(InnerZeroParamClass opr) {}

public void opr01(InnerZeroParamReturnClass opr) {}

public void opr1(InnerOneParamClass opr) {}

public void opr2(InnerTwoParamClass opr) {}
lambda 例子介紹

下面通過(guò)舉幾個(gè)例子來(lái)介紹最基礎(chǔ)的lambda 最基礎(chǔ)的語(yǔ)法,例子間的順序?yàn)橹饾u深入,每個(gè)例子在前面的例子的基礎(chǔ)上在介紹一個(gè)新的特點(diǎn)

  1. 基本語(yǔ)法(v1, v2) -> {},我們以opr2方法為例子
opr2((a, b) -> {
    int sum = a + b;
    System.out.println(sum);
});
  1. 如果參數(shù)只有一個(gè),則可以省略箭頭左側(cè)的圓弧括號(hào)
opr1(a -> {
    int square = a * a;
    System.out.println(square);
});
  1. 如果沒(méi)有參數(shù),則需要一對(duì)圓弧括號(hào)
opr0(() -> {
    String result = "no param";
    System.out.println(result);
});
  1. 如果匿名內(nèi)部類只有一條語(yǔ)句(不一定是一行,可以是鏈?zhǔn)?,那么可以省略大括號(hào)
opr1(v ->
    System.out.println("")
;

//這個(gè)例子還屬于第2種語(yǔ)法情況
  1. 如果匿名內(nèi)部類的方法體只有一個(gè)語(yǔ)句,且參數(shù)A是相同的,那么可以用雙冒號(hào)寫(xiě)法,即去掉(v1, v2) ->以及方法的(param)部分,方法調(diào)用.改成方法引用::,如下
opr1(A ->
    System.out.println(A)
;,
//上面滿足條件1.方法體只有一個(gè)語(yǔ)句;2該語(yǔ)句方法的參數(shù)和'->'左側(cè)的參數(shù)是同一個(gè)變量
//所以可以變成簡(jiǎn)寫(xiě)成下面這種寫(xiě)法
opr1(System.out::println); //println 是 out 的靜態(tài)方法,同樣的如果是調(diào)用成員方法,格式為 obj::method

  1. 如果匿名內(nèi)部類只有一個(gè)返回語(yǔ)句,可以省略 return 關(guān)鍵字
opr01(() -> "Done");

//這個(gè)例子還屬于第3, 4種語(yǔ)法情況

以上的六個(gè)例子基本涵蓋了lambda的所有語(yǔ)法規(guī)則,也就是說(shuō)看懂上面幾個(gè)例子后,閱讀和使用 lambda 已經(jīng)不成問(wèn)題了。本章之所以沒(méi)有其它篇幅那么長(zhǎng),是因?yàn)槠渌L(zhǎng)篇幅文章介紹的比較詳細(xì),包括新的集合類型的 API 之類的,但是其實(shí)新的API使用到的也只是上面的這六種語(yǔ)法,比如 List 接口的 foreach,可以用來(lái)簡(jiǎn)寫(xiě)遍歷集合的代碼,如下:

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

看到上面的的寫(xiě)法,很讓人激動(dòng)人心,但點(diǎn)擊去一看這個(gè)forEach,無(wú)非就是接收了一個(gè)只有一個(gè)方法的接口對(duì)象,然后運(yùn)用上面第5種 lambda 寫(xiě)法而已,沒(méi)什么神奇的,所以這些新的相關(guān) API的定義并不屬于 lambda 語(yǔ)法范疇,也就是說(shuō) lambda 語(yǔ)法就是這么簡(jiǎn)單,大家完全看一會(huì)寫(xiě)一寫(xiě)就可以在項(xiàng)目中使用。

我目前不是做純 Java 開(kāi)發(fā),所以用 AS 來(lái)支持像 List 的forEach之類的新 API 會(huì)比較麻煩,需要 API 24以上,或者是集成第三方 lambda 支持框架。新API 大多數(shù)情況都可以用相關(guān)操作符替代,代碼量也接近新 API,所以這里就不介紹了。

所以本章只介紹 lambda 語(yǔ)法,不深入其它關(guān)聯(lián)的 API,如果大家對(duì)相關(guān)新增的 API 有興趣,可以看這邊文章哦

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容