日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

Lambda表达式及应用

發(fā)布時(shí)間:2025/3/11 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Lambda表达式及应用 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目錄

    • Lambda表達(dá)式
      • 概念
      • 應(yīng)用
        • 在forEach()方法使用
        • 用來(lái)替代匿名內(nèi)部類
          • 代碼驗(yàn)證(Lambda表達(dá)式替代匿名內(nèi)部類)

Lambda表達(dá)式

概念

語(yǔ)法形式: () -> {}
組成:

  • 括號(hào):表示參數(shù)列表;
  • 箭頭:表示lambda運(yùn)算符,讀作goes to;
  • 花括號(hào):表示方法體。
  • 參數(shù)列表相關(guān)概念:

    參數(shù)個(gè)數(shù):
    無(wú)參數(shù),或者,1個(gè)或多個(gè);
    另外,只有一個(gè)參數(shù)時(shí)括號(hào)可以省略。

    參數(shù)的類型:
    一般不定義參數(shù)類型,由編譯器推理得到,或者特殊情況下,可以自己指定這些參數(shù)的類型。

    方法體:
    方法體中可以放參數(shù)相關(guān)的多句執(zhí)行語(yǔ)句,也可以有return語(yǔ)句,當(dāng)代碼語(yǔ)句只有一句時(shí),花括號(hào)可以省略。不在方法體中定義新的方法。有待考證*1

    應(yīng)用

    在forEach()方法使用

    Arrays.asList(1, 2, 3, 4, 5).forEach(x -> System.out.println(x));

    用來(lái)替代匿名內(nèi)部類

    1、繼承式匿名內(nèi)部類如下:

    new “類名”(){}

    Lambda表達(dá)式代替:無(wú)法替代。有待考證*2
    匿名內(nèi)部類的花括號(hào)內(nèi)是空的,對(duì)應(yīng)Lambda表達(dá)式花括號(hào)內(nèi)也是空的,但會(huì)【報(bào)錯(cuò)】Not a statement。說(shuō)明不能是空的,得有執(zhí)行語(yǔ)句。

    2、接口式匿名內(nèi)部類如下:

    new “接口名”(){//重寫這個(gè)父類“接口名”的一些或全部方法public 返回類型 方法名(參數(shù)類型 參數(shù)){//代碼執(zhí)行語(yǔ)句} }

    Lambda表達(dá)式代替:

  • 當(dāng)接口只有一個(gè)方法時(shí),重寫方法只有一個(gè)時(shí),Lambda表達(dá)式可以成功代替。
  • (參數(shù))->{//重寫方法對(duì)應(yīng)的代碼執(zhí)行語(yǔ)句 }
  • 當(dāng)接口只有多個(gè)方法時(shí),即重寫方法有多個(gè)時(shí),Lambda表達(dá)式無(wú)法按上述1中格式:把每個(gè)重寫方法的執(zhí)行語(yǔ)句寫上。
    【報(bào)錯(cuò)】:Multiple non-overriding abstract methods found in interface test.CarFun。
  • 有待考證*3:是不是我不知道接口多個(gè)方法時(shí),Lambda表達(dá)式的替換接口式匿名內(nèi)部類的方法。

    代碼驗(yàn)證(Lambda表達(dá)式替代匿名內(nèi)部類)

    代碼示例:

    接口CarFun.java:

    main函數(shù)驗(yàn)證:Test.java

    下圖在main函數(shù)下寫了接口式匿名內(nèi)部類。并用zerocarfun調(diào)用了drive()和stop()方法。接下來(lái)要寫一個(gè)Lambda表達(dá)式替換它。

  • Lambda表達(dá)式只重寫一個(gè)方法drive()情況下:

    對(duì)應(yīng)上圖,替換成Lambda表達(dá)式后,執(zhí)行代碼結(jié)果:
  • zero開車了,已經(jīng)開了0.7928757329649554千米

    說(shuō)明替換成功了。

  • Lambda表達(dá)式重寫drive()和stop()多個(gè)方法情況下:
    先打開CarFun中第5行代碼注釋。

    CarFun接口添加stop()方法后。【報(bào)錯(cuò)】:在CarFun接口中找到多個(gè)非重寫的抽象方法。
  • 在Lambda表達(dá)式里添加stop()方法的執(zhí)行語(yǔ)句:

    System.out.println("zero停車了");


    仍然【報(bào)錯(cuò)】:在CarFun接口中找到多個(gè)非重寫的抽象方法。

    不知道如何用Lambda表達(dá)式替代,有多個(gè)方法的接口式匿名內(nèi)部類。

    考證*3:
    百度一下報(bào)錯(cuò)信息。
    知道:@FunctionalInterface會(huì)告訴編譯器可以用Lambda表達(dá)式。
    我很好奇這個(gè)是什么注解?我在接口上寫了這個(gè)注解。
    也【報(bào)錯(cuò)】:在CarFun接口中找到多個(gè)非重寫的抽象方法。

    我點(diǎn)進(jìn)源碼,查看了這個(gè)注解的概述。猜猜我發(fā)現(xiàn)了什么?我發(fā)現(xiàn)了一個(gè)關(guān)鍵句子:

    Conceptually, a functional interface has exactly one abstract method.

    從概念講,一個(gè)functional interface有且僅有一個(gè)抽象方法。

    進(jìn)一步百度f(wàn)unctional interface。
    發(fā)現(xiàn)這個(gè)是函數(shù)式接口的意思。
    結(jié)合上面百度到的:@FunctionalInterface會(huì)告訴編譯器可以用Lambda表達(dá)式。

    說(shuō)明:Lambda表達(dá)式替換接口式匿名內(nèi)部類時(shí),這個(gè)匿名內(nèi)部類相對(duì)應(yīng)的接口只能有一個(gè)抽象方法。

    結(jié)論:Lambda表達(dá)式替代接口式匿名內(nèi)部類時(shí),相對(duì)應(yīng)的接口是一個(gè)函數(shù)式接口。

    進(jìn)一步,查看Predicate源碼時(shí)發(fā)現(xiàn),函數(shù)式接口只有一個(gè)抽象方法,但可以有多個(gè)default修飾的非抽象的方法,或者非抽象的靜態(tài)方法。

    考證*2:
    進(jìn)一步百度,了解,Lambda表達(dá)式替代匿名內(nèi)部類,指就是上述結(jié)論中的情況,替代接口式匿名內(nèi)部類,不是替代繼承式匿名內(nèi)部類。

    考證*1:
    從替代接口式匿名內(nèi)部類角度看:花括號(hào)方法體中不定義新的方法,也不寫方法名,直接寫重寫的代碼執(zhí)行語(yǔ)句即可。

    有待進(jìn)一步考證*1

    總結(jié)

    以上是生活随笔為你收集整理的Lambda表达式及应用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。