日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Lambda表达式及应用

發布時間:2025/3/11 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Lambda表达式及应用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

    • Lambda表達式
      • 概念
      • 應用
        • 在forEach()方法使用
        • 用來替代匿名內部類
          • 代碼驗證(Lambda表達式替代匿名內部類)

Lambda表達式

概念

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

  • 括號:表示參數列表;
  • 箭頭:表示lambda運算符,讀作goes to;
  • 花括號:表示方法體。
  • 參數列表相關概念:

    參數個數:
    無參數,或者,1個或多個;
    另外,只有一個參數時括號可以省略。

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

    方法體:
    方法體中可以放參數相關的多句執行語句,也可以有return語句,當代碼語句只有一句時,花括號可以省略。不在方法體中定義新的方法。有待考證*1

    應用

    在forEach()方法使用

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

    用來替代匿名內部類

    1、繼承式匿名內部類如下:

    new “類名”(){}

    Lambda表達式代替:無法替代。有待考證*2
    匿名內部類的花括號內是空的,對應Lambda表達式花括號內也是空的,但會【報錯】Not a statement。說明不能是空的,得有執行語句。

    2、接口式匿名內部類如下:

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

    Lambda表達式代替:

  • 當接口只有一個方法時,重寫方法只有一個時,Lambda表達式可以成功代替。
  • (參數)->{//重寫方法對應的代碼執行語句 }
  • 當接口只有多個方法時,即重寫方法有多個時,Lambda表達式無法按上述1中格式:把每個重寫方法的執行語句寫上。
    【報錯】:Multiple non-overriding abstract methods found in interface test.CarFun。
  • 有待考證*3:是不是我不知道接口多個方法時,Lambda表達式的替換接口式匿名內部類的方法。

    代碼驗證(Lambda表達式替代匿名內部類)

    代碼示例:

    接口CarFun.java:

    main函數驗證:Test.java

    下圖在main函數下寫了接口式匿名內部類。并用zerocarfun調用了drive()和stop()方法。接下來要寫一個Lambda表達式替換它。

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

    對應上圖,替換成Lambda表達式后,執行代碼結果:
  • zero開車了,已經開了0.7928757329649554千米

    說明替換成功了。

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

    CarFun接口添加stop()方法后。【報錯】:在CarFun接口中找到多個非重寫的抽象方法。
  • 在Lambda表達式里添加stop()方法的執行語句:

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


    仍然【報錯】:在CarFun接口中找到多個非重寫的抽象方法。

    不知道如何用Lambda表達式替代,有多個方法的接口式匿名內部類。

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

    我點進源碼,查看了這個注解的概述。猜猜我發現了什么?我發現了一個關鍵句子:

    Conceptually, a functional interface has exactly one abstract method.

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

    進一步百度functional interface。
    發現這個是函數式接口的意思。
    結合上面百度到的:@FunctionalInterface會告訴編譯器可以用Lambda表達式。

    說明:Lambda表達式替換接口式匿名內部類時,這個匿名內部類相對應的接口只能有一個抽象方法。

    結論:Lambda表達式替代接口式匿名內部類時,相對應的接口是一個函數式接口。

    進一步,查看Predicate源碼時發現,函數式接口只有一個抽象方法,但可以有多個default修飾的非抽象的方法,或者非抽象的靜態方法。

    考證*2:
    進一步百度,了解,Lambda表達式替代匿名內部類,指就是上述結論中的情況,替代接口式匿名內部類,不是替代繼承式匿名內部類。

    考證*1:
    從替代接口式匿名內部類角度看:花括號方法體中不定義新的方法,也不寫方法名,直接寫重寫的代碼執行語句即可。

    有待進一步考證*1

    總結

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

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。